SpringCloud之Stream-5.消费组和消息分区详解

2021-09-30  本文已影响0人  那钱有着落吗

消费组

前面我们接触的都是广播场景,话说这个广播模式简直就是个围观模式,所有订阅相同主题的消费者都眼巴巴看着生产者发布的消息,一个消息在所有节点都要被消费一遍。如果我只想挑一个节点来消费消息,而且又不能只逮着一只羊来薅羊毛,必须利用负载均衡来分发请求。这个Stream能不能办到呢?
这不就是单播模式吗,那自然不在话下,Stream里的消费组就是专门解决这个问题的。让我们来用一个案例说明它的工作模式:


image.png

在上面这个例子中,“商品发布”就是一个消息,它被放到了对应的消息队列中,有两拨人马同时盯着这个Topic,这两拨人马各自组成了一个Group,每次有新消息到来的时候,每个Group就派出一个代表去响应,而且是从这个Group中轮流挑选代表(负载均衡),这里的Group也就是我们说的消费者。
在Stream里配置一个消费组非常简单,下一小节我就带大家去做一个Demo。在这里我就先小剧透一点内容好了:

spring.cloud.stream.bindings.group-producer.group=Group-A

消费分区

消费分区消费组,傻傻分不清楚。这两个名字听起来很像,其实并不是一码事,消费组相当于是每组派一个代表去办事儿,而消费分区相当于是专事专办,也就是说,所有消息都会根据分区Key进行划分,带有相同Key的消息只能被同一个消费者处理。
我们来看下面的消息分区例子:


image.png

消息分区有一个预定义的分区Key,它是一个SpEL表达式(想想前面哪一章节讲过SpEL?提示换一下,Key Resolver)。我们需要在配置文件中指定分区的总个数N,Stream就会为我们创建N个分区,这里面每个分区就是一个Queue(可以在RabbitMQ管理界面中看到所有的分区队列)。
当商品发布的消息被生产者发布时,Stream会计算得出分区Key,从而决定这个消息应该加入到哪个Queue里面。在这个过程中,每个消费组/消费者仅会连接到一个Queue,这个Queue中对应的消息只能被特定的消费组/消费者来处理。

上一篇 下一篇

猜你喜欢

热点阅读