总结一下RMQ消费者的一些问题。
RMQ 消费者
消息拉取方式
PUSH方式
DefaultMQPushConsumer
系统封装(消息获取方式)
PullMessageService
未处理消息个数超过1000个或消息大小超过100M就延迟拉取
顺序消费的时候,拉取消息前需要获取消息消费处理队列的锁
消息消费封装成PullCallback,用Netty的ChannelFutureListener异步回调
消费者订阅信息的tag进行过滤下
把拉取到的消息放到消息消费处理队列中
提交消息消费请求到ConsumeMessageService中
broker端会返回消息下一个拉取偏移量
自动调用监听器回调处理
PULL方式
DefaultMQPullConsumer
自己封装
消息回调由用户控制(需要开发回调操作)
消息消费模式
集群模式
MessageModel.CLUSTERING
单个consumer消费
广播模式
MessageModel.BROADCASTING
多个Consumer消费
消息消费方式
并行消费
ConsumeMessageConcurrentlyService
顺序消费
ConsumeMessageOrderlyService
获取MessageQueue队列的锁(MessageQueueLock)
获取消息消费处理队列ProcessQueue的锁,这里是可重入锁
调用消息业务处理逻辑
处理消息消费结果
消费负载均衡
客户端进行
按消息队列和消费者进行
核心类:RebalanceService
分级负载:整体安装GROUP,TOPIC负载按照consumer实例
负载均衡
广播负载均衡
广播是需要处理主题下的所有消息队列
集群负载均衡
集群是需要处理根据负载均衡策略产生的队列
在重复消费的问题
集群模式下消息消费失败会进行重试
消息发送到broker
broker会为每个消费组设置一个retry topic
更新MessageQueue的消息消费偏移量
先更新到本地缓存中,
后续有定时任务会进行消费进度的持久化