RocketMQ消息消费概览
概览
RocketMQ消息消费以消费组为消费维度的,消费组之间消息消费有集群模式与广播模式两种消费模式。
广播模式
主题下的同一条消息将被集群内的所有消费者消费一次。
集群模式
主题下的同一条消息只允许被其中一个消费者消费。一个消费组内可以包含多个消费者,一个消费者组订阅相同的消息主题,一个主题Topic拥有多个消息存储队列。每一个组内的消费者可以消费这个Topic下的多个消息队列,Topic下的一个消息队列只能被一个同一个组的一个消费者消费。
消息服务器与消费者之间的消息传送也有两种方式:推模式、拉模式。
拉模式
消费端一定的频率主动发起拉消息请求,获得服务端消息相应,再按照相同的频率发起拉消息请求。现在官方已经不推荐使用这种模式了。这个时候一定处理好拉取频率的设定,避免下面两种情况的出现。
- 消息堆积,服务端每分钟接受10万消息,消费端每分钟只能消息5万条消息,服务端忙,而消费者处理不过来。
- 消息空缺,服务端每小时接受到一条消息,消费者每次都去拉取消失,只能获取空消息,浪费计算机和网络资源。
推模式
消息到达消息服务器后,推送消息给消费者。 RocketMQ消息推模式并不是真正意义上的服务端将消息推送给消费端。本质实现为消费端消息拉取线程在从服务器拉取到一批消息后,然后提交到消息消费线程池后,又“马不停蹄”的继续向服务器再次尝试拉取消息,再提交到消息消费线程池,然后由消费端消费线程异步的从消费线程池获取消息进行消息消费,解耦了消息拉取和消息消费过程。如果未拉取到消息,则延迟一下又继续拉取。
顺序消息
顺序消息是指消息消费的顺序和生产者发送消息的顺序一样的。
例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才能有意义,但是同时订单之间是可以并行消费的。RocketMQ可以严格的保证消息有序。
分区有序
分区有序是指这个Topic下这个队列下的消息是有顺序的,生产者发送消息的时候,将严格按照消息的顺序,将消息们发送到一个Topic下的一个队列,从而保证了生产者分区消息有序,消费者进行消费时,进行单线程单队列消费,保证了消费有序。
适用场景:性能要求高,以 sharding key 作为分区字段,在同一个队列中严格的按照 FIFO 原则进行消息发布和消费的场景。sharding key 比如订单Id,一个订单的创建、付款、完成有序的,根据算法将这个订单的所有事件发送到同一个队列中去。
全局有序
全局有序是指某个Topic下的所有消息都要保证顺序,可以通过一个Topic只有一个消息队列,保证了全局有序,实际上市分区有序的变种。
适用场景:性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景。