应用进程、消费组、消费者实例的关系
消费组可以有多个消费者实例。
同一进程,同一个消费组不允许有相同的消费者实例。
不同进程,不能创建相同消费者实例,可能产生两个实例分配到相同的队列,部分队列却没有消费的情况。
不同进程,不能创建相同消费者实例,如上图中的实例A,两个实例均连到Q1跟Q2,但Q3与Q4并无消费。
应用在创建消费者实例时,指定消费者实例名,应用需要保证不同的进程间,同一消费组不能有相同的实例名。或者应用在创建消费者实例时,不指定实例名,RocketMQ会创建唯一的实例名(JAVA SDK),规则是:groupName|ip|pid|线程id|uuid。
同组Consumer订阅关系一致
RocketMQ 里的一个 Consumer Group 代表一个 Consumer 群组。对于大多数分布式应用来说,一个 Consumer Group 下通常会有多个 Consumer 实例。订阅关系一致指的是同一个 Consumer Group 下所有 Consumer 实例的处理逻辑必须完全一致,一旦订阅关系不一致,消息消费的逻辑就会混乱,甚至导致消息丢失。
由于 RocketMQ 的订阅关系主要由 Topic+Tag 共同组成,因此,保持订阅关系一致意味着同一个 Consumer group 下所有的实例需在以下两方面均保持一致:
1.订阅的 Topic 必须一致。
2.订阅的 Topic 中的 Tag 必须一致。
实例的创建和销毁
1.使用CTGFactory进行创建实例【强制规范】。
2.Consumer是重量级的实例,每次创建、销毁都会消耗系统资源,建议系统 启动的时候创建,系统退出的时候关闭,禁止每次消费消息都创建新的实例【强制规范】。
多消费组消费
一个Topic,可以使用多个消费组消费消息,每个消费组将在服务端独立保存进度。
集群消费意味着多个消费者均衡消费Topic的消息,由于经常不同的程序由多个开发者进行研发和调试,如果使用同一个消费组,在调试过程中存在被其他程序消费者消费的可能,因此应该尽量避免多种类型的应用程序使用同一个消费组。
消费位置设置
消费位置重置可通过控制台进行按时间重置,客户端必须离线。
堆积量
不建议高堆积量的消费,为了预防出现高堆积的情况,建议:
1.边生产边消费,如果消费速度跟不上,增加消费者。
2.消费者一直在线,不要等生产了一段时间再开启消费者,这样会造成消费的堆积。