RocketMQ—Queue队列分配算法

 RocketMQ(Java语言开发的组件):

mq:生产者到消费者的设计模式;

生产者:往queue存放消息;

消息队列:储存消息;

消费者:消费消息;

RocketMQ优势:

①异步处理:比如解决es中冷启动的问题,mysql与redis在高并发场景下双写不一致的问题(canal),订单超时未支付的问题,秒杀场景下超买超卖的问题(redission);

②应用解耦:可以使得系统达到完全解耦;

③流量削峰:高并发情景下,消息队列可以将大量请求缓存起来,分散到很长一段时间处理,避免请求丢失或者系统被压垮;

④分布式架构:高可用,qps可达10万级,得到淘宝天猫双十一的实战稳定性验证;

RocketMQ工作流程:

RocketMQ—Queue队列分配算法_第1张图片

 发送消息的步骤:
1.创建消息生产者producer(DefaultMQProducer),并制定生产者group
2.指定Nameserver地址
3.启动producer
4.创建Message对象,指定主题Topic、消息体
5.发送消息
6.关闭生产者producer

Queue分配算法:

一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同时消费多个Queue中的消息。常见的Queue分配算法有四种,分别是:平均分配策略、环形平均策略、一致性hash策略、同机房策略。这些策略是通过在创建Consumer时的构造器传进去的;

①平均分配策略

算法公式:avg=QueueCount(队列数量)/ConsumerCount(消费者数量)

若能整除,则按照avg个Queue诸葛分配Consumer,如果不能整除,将多于的Queue按照Consumer顺序逐个分配(通过地址坐标简单排序)。

②环形平均策略

环形平均算法是指:根据消费者的顺序,依次在由queue队列组成的环形图中逐个分配,该方法不需要提前计算。如图:

RocketMQ—Queue队列分配算法_第2张图片

 一致性hash策略:

该算法会将Consumer的Hash值作为Node节点存放到Hash环上,然后Queue的Hash值也放到Hash环上,通过逆时针方向,距离Queue最近的那个Consumer就是该Queue要分配Consumer;

RocketMQ—Queue队列分配算法_第3张图片

缺点:
分配效率较低,容易导致分配不均的情况;

优点:
其可以有效减少由于消费者组扩容或缩容所带来的大量的Rebalance。因此适合用在Consumer数量变化较频繁的场景;

同机房策略:

该算法会根据Queue的部署机房位置和Consumer的位置,过滤出当前相同机房的Queue,然后按照平均分配或者环形平均策略同机房的Queue进行分配,如果没有同机房的Queue,则会按照平均策略或者环形平均策略所有的Queue进行分配;

RocketMQ—Queue队列分配算法_第4张图片

 至少一次原则:

RocketMQ有一个原则,每条消息必须被成功消费一次,Consumer在消息消费完成后会向其消费进度记录器提交消费消息的offset,offset被成功记录到记录器中,那么这条消息就被成功消费了;

消费进度记录器

消费者-集群模式(Broker)

当有多个消费者同时监听某个topic时,集群模式只允许消息被消费一次,一条具体的消息不会被重复消费,一种默认行为;

流程:

1.创建消费者Consumer(DefaultMQPushConsumer),指定消费者组名
2.指定Nameserver地址
3.订阅(subscribe)主题Topic
4.设置消费模式(MessageModel),默认集群模式-------------

consumer.setMessageModel(MessageModel.CLUSTERING);
5.注册(register)回调函数,处理消息
6.启动消费者

消费者-广播模式(Consumer)

当有多个消费者同时监听某个topic时,广播模式 消息会被每个消费者同时消费;

流程:

1.创建消费者Consumer(DefaultMQPushConsumer),指定消费者组名
2.指定Nameserver地址
3.订阅(subscribe)主题Topic
4.设置消费模式(MessageModel),默认集群模式  ------------consumer.setMessageModel(MessageModel.BROADCASTING);
5.注册(register)回调函数,处理消息
6.启动消费者

MQ分配算法的底层源码分析

Rocketmq之消息队列分配策略算法实现的源码分析_yamaxifeng_132的博客-CSDN博客

你可能感兴趣的:(java-rocketmq,rocketmq,java)