Consumer-集群Push模式-简介:
0、背景介绍
Consumer主要用于向Broker请求Producer产生的消息,对其进行消费;对于RocketMQ,我们一定很好奇,如何实现分布式的Consumer消费,如何保证Consumer的顺序性,不重复性呢?
存在的问题:
1. 如果在集群模式中新增/减少 组(group) 消费者,可能会导致重复消费;原因是:
假设新增消费者前,ConsumerA正在消费MessageQueue-M,消费到第3个offset,
这个时候新增了ConsumerB,那么根据集群模式的AllocateMessageQueue的策略,可能MessageQueue-M被分配给了ConsumerB,这个时候ConsumerA由于消费的offset没有实时更新回去,会导致ConsumerB和ConsumerA之前的消费有重叠;
2. 消费失败怎么办?
3. 异常处理
4. 线程,Auto变量的使用
一、术语介绍
topic: 最细粒度的订阅单位,一个group可以订阅多个topic的消息
group: 组,一个组可以订阅多个topic
clientId: 一个服务(IP/机器)的标识,一个机器可以有多个group;同时,多个相同group的clientId组成一个集群,一起消费消息
messageQueue:消息队列,一个broker的一个topic有多个messageQueue
offset: 每一个消息队列里面还有偏移(commitOffset, offset)的区别,为什么有2个offset呢??
集群消费:
广播消费:
立即消费:
顺序消费:
消费位置:
offsetStore---------commitOffset:消费到的offset
PullRequest ------ offset的区别:拉取的位置
二、总体框架
三、数据结构
数据结构主要分为2个部分来讲解:
一部分是在MQClientInstance中进行统一管理的,不管是Consumer还是Producer,能够统一管理的部分都放在了这个区域;
还有一部分是在Consumer或Producer中区分管理的,比如各自订阅的MessageQueue,下面对这两个部分分别介绍;
-----------------------------------------------PartI:MQClientInstance---------------------------
1. TopicRouteData:
用于保存了所有的Queue信息,不管是consumer还是producer的private String orderTopicConf;//brokerName:num count
private List<QueueData> queueDatas;
private List<BrokerData> brokerDatas;
private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
<