多个mq如何选型
RocketMQ
- Java开发
- 集群化,效率高,每秒可解决几十万条音讯
- 有音讯查问界面
- 音讯可靠性高
Kafka
- Scala开发
- 效率高
- 音讯失落概率大,适宜做日志收集、埋点上报等业务
RabbitMQ
- erlang开发
- 对音讯沉积反对不敌对
ActiveMQ
- Java开发,简略、稳固,效率不高
MQ的作用
解耦
- 上游发mq,上游订阅,上游不须要关怀有哪些上游零碎,不须要与上游间接交互
异步
- 不须要同步执行的业务逻辑,异步解决,缩小响应工夫
削峰
- 后端Service能够放弃固定速率生产,甚至进行生产,保证系统不被压垮
RocketMQ从生产发送到生产的执行流程
- Producer发送音讯到Broker,负载平衡策略默认随机
- Broker接管音讯,写入PageCage,返回胜利
- Broker刷盘,音讯存储Consumer queue、commit log
- Consumer从Broker拉取音讯,拉取形式长轮询pull
- Consumer生产音讯,解决业务逻辑
- Consumer返回ACK,更新Broker offset
- 生产失败,音讯转入失败队列
- Broker的ScheduleService从重试队列拉取音讯,重放这个音讯
- 重试16次如果还是失败,音讯进入死信队列
- 通过RocketMQ操作面板监控死信队列,手动解决
RocketMQ如何做负载平衡
Topic在Broker集群中分布式存储
Producer端:轮询
Consumer端:平均分配策略,一个队列最多被一个生产组的一个Consumer生产,一个Consumer能够生产多个队列
RocketMQ如何保障音讯不失落
1、Producer端
- 采取send()同步发消息,发送后果是同步感知的。
- 发送失败后能够重试,设置重试次数。默认3次。
producer.setRetryTimesWhenSendFailed(10);
- 集群部署,比方发送失败了的起因可能是以后Broker宕机了,重试的时候会发送到其余Broker上。
2、Broker端
- 批改刷盘策略为同步刷盘
- 批改主从复制策略为同步复制
3、Consumer端
- 生产胜利后会返回ACK,更新Broker的offset
音讯失落的场景
- 异步刷盘,Broker宕机,未实现刷盘
- 异步复制,主Broker宕机,未实现复制
反复生产问题
1、造成反复生产的起因
- Consumer生产完,宕机,未返回ACK
- Consumer生产完,返回ACK,网络断开,Broker未收到
- 主Broker更新ACK,副Broker未复制,主Broker宕机
2、解决
业务方管制幂等
- 定义业务幂等字段,数据库定义为惟一键
怎么发送程序音讯
- 将音讯发送到同一个队列中
- 通过重写MessageQueueSelector接口,将不同的音讯发送到指定的队列
- Consumer生产的时候如果是多线程,须要先应用synchronize获取锁
- 一条音讯生产失败,将阻塞整个队列,所以个别不必
RocketMQ效率高的起因
- 分区并行。每个Topic能够设置多个MessageQueue(Partition),能够对应多个消费者实现并行处理
- 程序写磁盘。对commit log采纳追加写的形式,新音讯被追加到文件的末端
- 利用页缓存PageCache。Broker收到数据后,写入PageCache即算胜利,由操作系统本人管制刷盘
- 零拷贝。消费者能够间接从PageCache读取数据,缩小了数据复制次数,防止了用户态与内核态之间的切换
- 应用Netty框架实现高性能的网络传输
RocketMQ与Kafka的异同
1、定位
- Kafka定位高吞吐,对音讯反复、失落没严格要求,实用数据量超大的日志收集、埋点数据收集等常见
- RocketMQ思路源于Kafka,提供了更牢靠的音讯传输,具备高吞吐、高可用个性,实用大规模分布式系统利用
2、单机反对队列数
- Kafka队列数超过64个性能会降落,对多个Partition文件的程序写在操作系统层面变成了随机写
- RocketMQ队列数增多效率无显著降落,因为数据存储在一个commit log
3、数据可靠性
- Kafka应用异步刷盘,异步主从复制,Producer只反对异步发送音讯,且会积攒一批音讯一起发
- RocketMQ反对同步刷盘,同步主从复制,Producer发送音讯反对同步、异步、单向三种模式
4、过后音讯
- Kafka不反对
- RocketMQ反对level级别的定时音讯
5、音讯失败重试
- Kafka不反对
- RocketMQ反对工夫level级别的重试
以下RocketMQ反对,Kafka不反对:
6、分布式事务音讯
7、程序音讯
8、音讯查问
9、音讯回溯
RocketMQ音讯底层存储模型
- CommitLog存储真正的音讯体
- ConsumerQueue是CommitLog的索引文件,存储音讯在CommitLog的物理偏移量,音讯大小,tag的hashCode
- IndexFile是面板查问的索引文件
定时音讯实现原理
- 提早级别大于0示意提早音讯,将音讯转存到SCHEDULE_TOPIC_XXX队列
- ScheduleService定时工作拉取延时队列中的音讯(未到延时工夫则提早100毫秒再拉)
- 依据偏移量从CommitLog拉取音讯体
- 复原成原来的音讯主题,将音讯投递到原主题队列
音讯沉积如何解决
1、减少Consumer,减少MessageQueue,减少Consumer线程数
2、新建一个Topic,先生产将音讯搬运到另外一个Topic,后用新Consumer生产解决
分布式事务音讯实现原理
Half Message:预处理音讯,当broker收到此类音讯后,会存储到RMQ_SYS_TRANS_HALF_TOPIC的音讯生产队列中
查看事务状态:Broker会开启一个定时工作,生产RMQ_SYS_TRANS_HALF_TOPIC队列中的音讯,每次执行工作会向音讯发送者确认事务执行状态(提交、回滚、未知),如果是未知,Broker会定时去回调在从新查看。
超时:如果超过回查次数,默认回滚音讯。
也就是他并未真正进入Topic的queue,而是用了长期queue来放所谓的half message,等提交事务后才会真正的将half message转移到topic下的queue。
其余
RocketMQ生产模式有几种?
生产模型由Consumer决定,生产维度为Topic。
- 集群生产
1.一条音讯只会被同Group中的一个Consumer生产2.多个Group同时生产一个Topic时,每个Group都会有一个Consumer生产到数据
- 播送生产
音讯将对一 个Consumer Group 下的各个 Consumer 实例都生产一遍。即即便这些 Consumer 属于同一个Consumer Group ,音讯也会被 Consumer Group 中的每个 Consumer 都生产一次。
如果让你来入手实现一个分布式消息中间件,整体架构你会如何设计实现?
- 反对集群,反对疾速扩容
- 音讯存储模型
- 高性能
- 高可用性
- 数据0失落的思考