IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 消息队列MQ -> 正文阅读

[大数据]消息队列MQ

解耦利器:MQ

A系统发送数据到BCD系统,明明需要数据的是BCD,更改代码却需要在A系统实现,架构中出现了反向依赖
在这里插入图片描述

使用MQ,A系统产生数据发送到MQ里,哪个系统需要数据则去MQ消费,如果不需要就取消订阅。A不需要考虑给谁发消息
在这里插入图片描述
通过MQ,A 系统就跟其它系统解耦了

异步通信

在这里插入图片描述
上游不关心下游执行结果,用户请求发送消息到MQ直接返回。
在这里插入图片描述

削峰

高峰期不论发送多少请求系统只处理MQ放行请求,减轻底层DB压力

MQ的高可用

RabbitMQ的镜像集群模式

元数据和队列(queque)都在多个实例上,每个RabbitMQ节点都有queque的完整镜像
在这里插入图片描述
优点:高可用,不怕宕机
缺点:性能开销大,非分布式,没有扩展性

Kafka的高可用

Kafka由多个节点(broker)组成,topic由partition组成,存在于不同节点上,topic分散在多个机器上,Kafka是一个天然的分布式消息队列

RabbitMQ一个queque都是放在一个节点里的,不是分布式
Kafka在0.8以前没有副本,一个broker宕机=所有partition消失

Kafka 0.8以后提供了高可用机制(High Availability),就是副本机制(replica),每个partition的数据都同步到其他机器上,形成多个副本,所有副本选举一个领袖(leader),消费与生产者只和leader副本交互,leader会把数据同步到其他副本上(保证了数据的一致性,系统简单高效)

如果一个broker宕机,副本就重新选举leader,保证高可用

写数据时,生产者只写入leader副本,其他副本自动从leader中拉取数据,一旦所有数据同步完成,就返回确认字符(ack)给leader,leader再返回成功消息给生产者

消费时,只从leader读取数据,但是只有所有副本同步成功,并且返回确认字符,消费者才能读取到

保证消息必达

在这里插入图片描述

  1. 发送方调用SendMsg接口,把消息发送给消息队列

  2. 消息队列让消息落地,写入数据库,落地=成功

  3. 消息队列调用SendCallback接口,把确认字符返回给发送方

  4. MQ调用RecvCallback接口,把消息发送给接收方

  5. 接收方调用SendAck,回复MQ

  6. MQ接收到确认字符ACK,将已经落地的消息删除

设置一个timer,当消息超时或者丢失时,timer会重发消息,直到收到消息落地的消息,如果重传N次还没收到,就返回发送失败

为了保证消息必达:

  1. 收到消息先落地
  2. 通过超时,重传,确认保证消息必达

对于RabbitMQ,生产者需要开启confirm模式,每次写消息生产者都会分配一个唯一id,发送到RabbitMQ中,RabbitMQ开启消息持久化,将消息持久化到磁盘中,消费者关闭自动ack机制,手动回传确认消息

MQ的幂等性

为了保证消息必达,可能导致接收方或发送方收到重复消息
所以必须保证消息总线的幂等性
在这里插入图片描述
如果消息队列返回确认字符时消息丢失,发送端会重发消息
为了避免数据重复落地,MQ需要生成内部消息ID

  1. 全局唯一
  2. MQ生成,业务无关
  3. MQ保证幂等

如果接收方返回确认字符时消息丢失,消息队列会重发消息
为了保证业务幂等性,业务消息中必须有业务ID

  1. 同一个业务,全局唯一
  2. 发送方生成,业务相关
  3. 消费方判重,保证幂等

生产者发送每条数据时先生成一个全局唯一的订单ID,到达消费者之前先去Redis中查一下之前是不是消费过,没消费就写入Redis,消费了就不处理了

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:32:29  更:2021-08-21 15:34:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:49:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码