mq:生产者到消费者的设计模式;
生产者:往queue存放消息;
消息队列:储存消息;
消费者:消费消息;
①异步处理:比如解决es中冷启动的问题,mysql与redis在高并发场景下双写不一致的问题(canal),订单超时未支付的问题,秒杀场景下超买超卖的问题(redission);
②应用解耦:可以使得系统达到完全解耦;
③流量削峰:高并发情景下,消息队列可以将大量请求缓存起来,分散到很长一段时间处理,避免请求丢失或者系统被压垮;
④分布式架构:高可用,qps可达10万级,得到淘宝天猫双十一的实战稳定性验证;
发送消息的步骤:
1.创建消息生产者producer(DefaultMQProducer),并制定生产者group
2.指定Nameserver地址
3.启动producer
4.创建Message对象,指定主题Topic、消息体
5.发送消息
6.关闭生产者producer
一个Topic中的Queue只能由Consumer Group中的一个Consumer进行消费,而一个Consumer可以同时消费多个Queue中的消息。常见的Queue分配算法有四种,分别是:平均分配策略、环形平均策略、一致性hash策略、同机房策略。这些策略是通过在创建Consumer时的构造器传进去的;
算法公式:avg=QueueCount(队列数量)/ConsumerCount(消费者数量)
若能整除,则按照avg个Queue诸葛分配Consumer,如果不能整除,将多于的Queue按照Consumer顺序逐个分配(通过地址坐标简单排序)。
环形平均算法是指:根据消费者的顺序,依次在由queue队列组成的环形图中逐个分配,该方法不需要提前计算。如图:
该算法会将Consumer的Hash值作为Node节点存放到Hash环上,然后Queue的Hash值也放到Hash环上,通过逆时针方向,距离Queue最近的那个Consumer就是该Queue要分配Consumer;
缺点:
分配效率较低,容易导致分配不均的情况;
优点:
其可以有效减少由于消费者组扩容或缩容所带来的大量的Rebalance。因此适合用在Consumer数量变化较频繁的场景;
该算法会根据Queue的部署机房位置和Consumer的位置,过滤出当前相同机房的Queue,然后按照平均分配或者环形平均策略对同机房的Queue进行分配,如果没有同机房的Queue,则会按照平均策略或者环形平均策略对所有的Queue进行分配;
RocketMQ有一个原则,每条消息必须被成功消费一次,Consumer在消息消费完成后会向其消费进度记录器提交消费消息的offset,offset被成功记录到记录器中,那么这条消息就被成功消费了;
当有多个消费者同时监听某个topic时,集群模式只允许消息被消费一次,一条具体的消息不会被重复消费,一种默认行为;
流程:
1.创建消费者Consumer(DefaultMQPushConsumer),指定消费者组名
2.指定Nameserver地址
3.订阅(subscribe)主题Topic
4.设置消费模式(MessageModel),默认集群模式-------------
consumer.setMessageModel(MessageModel.CLUSTERING);
5.注册(register)回调函数,处理消息
6.启动消费者
当有多个消费者同时监听某个topic时,广播模式 消息会被每个消费者同时消费;
流程:
1.创建消费者Consumer(DefaultMQPushConsumer),指定消费者组名
2.指定Nameserver地址
3.订阅(subscribe)主题Topic
4.设置消费模式(MessageModel),默认集群模式 ------------consumer.setMessageModel(MessageModel.BROADCASTING);
5.注册(register)回调函数,处理消息
6.启动消费者
Rocketmq之消息队列分配策略算法实现的源码分析_yamaxifeng_132的博客-CSDN博客