RocketMQ设计架构以及工作流程

RocketMQ架构图

image-20220313212918945

消息生产者

发送消息方式:

  • 同步发送,消息发送至Broker后,需得到Broker的成功响应后才可进行下一个数据包发送。常用于重要消息业务场景,如通知邮件、营销短信等。
  • 异步发送,消息发送至Broker后,响应以异步方式返回,无需得到成功响应信息即可进行下一个数据包发送,失败后会进行重试发送、持久化信息,常用于对响应时间敏感场景,如批量发货等。
  • 单向发送,仅发送消息,并不关注发送结果的场景,失败后消息丢失。常用于对可靠性要求不高的场景,如日志收集。

image-20220307101310283

消息消费类型
  • 集群消费:消息仅被消费一次,消息重投不保证消费到同一台服务上。
  • 广播消费:每条消息需要被集群下的每个消费者处理。
消息消费方式
  • Pull模式:拉取待消费列表消息
  • Push模式:基于Pull模式封装,线程拉取拉取到消息后,提交到消息消费线程池,再次向服务器尝试拉取消息。
Producer负载均衡

Producer端在发送消息时,会先根据Topic找到指定的TopicPublishInfo,根据TopicPublishInfo使用随机递增取模算法获取一个MessageQueue发送消息。

image-20220315214223582

Consumer负载均衡

RocketMQ官方文档解释:

在RocketMQ中,Consumer端的两种消费模式(Push/Pull)都是基于拉模式来获取消息的,而在Push模式只是对pull模式的一种封装,其本质实现为消息拉取线程在从服务器拉取到一批消息后,然后提交到消息消费线程池后,又“马不停蹄”的继续向服务器再次尝试拉取消息。如果未拉取到消息,则延迟一下又继续拉取。在两种基于拉模式的消费方式(Push/Pull)中,均需要Consumer端知道从Broker端的哪一个消息队列中去获取消息。因此,有必要在Consumer端来做负载均衡,即Broker端中多个MessageQueue分配给同一个ConsumerGroup中的哪些Consumer消费。

RocketMQ消费端负载均衡主要是RebalanceImpl类实现的。

rebalanceByTopic(final String topic, final boolean isOrder)方法的集群模式为例:

image-20220314144710623

image-20220314144731236

image-20220314144743019

image-20220314144822661

  1. 根据topic获取消息消费队列
  2. 所有topic对应的所有消费者Id
  3. 对消费消息排序、对消费者id排序
  4. 获取负载均衡策略,默认平均分配算法,返回分配后的mqSet
  5. 更新消息处理队列
  6. 移除在processQueueTable 并且不存在于mqSet中的消息队列
  7. 把mqSet放入processQueueTable中
  8. 发起Pull请求
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值