消费者从Broker获取消息的方式有两种:pull拉取方式和push推动方式。消费者组对于消息消费的模式又分为两种:集群消费Clustering和广播消费Broadcasting。
推拉消费模式
拉取式消费
Consumer主动从Broker中拉取消息,主动权由Consumer控制。一旦获取了批量消息,就会启动消费过程。不过,该方式的实时性较弱,即Broker中有了新的消息时消费者并不能及时发现并消费
由于拉去时间间隔是由用户指定的,所以在设置该间隔时需要注意平稳:间隔太短,空请求比例会增加;间隔太长,消息的实时性太差
推送式消费
该模式下Broker收到数据后会主动推送给Consumer。该消费模式一般实时性较高。
该消费类型是典型的发布订阅模式,即Consumer向其关联的Queue注册了监听器,一旦发现有新的消息到来就会触发回调执行,回调方法是Consumer去Queue中拉取数据。而这些都是基于Consumer与Broker间的长连接。
对比
- pull:需要应用去实现对关联Queue的遍历,实时性差;但便于应用控制消息的拉取
- push:封装了对关联Queue的遍历,实时性强,但会占用较多的系统资源
消费模式
广播模式
广播消费模式下,相同Consumer Group的每个Consumer实例都接收同一个Topic的全量消息。即每条消息都会被发送到Consumer Group中的每个Consumer
集群消费
集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊同一个Topic的消息。即每条消息只会被发送到Consumer Group中的某个Consumer
消息进度保存
- 广播模式:消费进度保存在Consumer端。因为广播模式下Consumer Group中每个Consumer都会消费所有消息,但他们的消费进度时不同的。所有Consumer各自保存各自的消费进度。
- 集群模式:消费进度保存在Broker中。Consumer Group中的所有Consumer共同消费同一个Topic中的消息,同一条消息只会被消费一次。消费进度会参与到消费的负载均衡中,故消费进度是需要共享的。下图是Broker中存放的各个Topic的各个Queue的消费进度