持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
消费者组的概念,在RabbitMQ中是不存在的。但是,如果你接触过Kafka或者RocketMQ,那么对于组,你就不会陌生了。SCStream中的消费者分组策略,其实整体来看是一种类似于Kafka的分组消费机制。即不同group的消费者,都会消费到所有的message消息,而在同一个goup中,每个message消息,只会被消费一次。这种分组消费的策略,严格来说,在RabbitMQ中是不存在的,RabbitMQ是通过不同类型的Exchange来实现不同的消费策略。而使用SCStream框架,就可以直接在RabbitMQ中实现这种分组消费的策略。
spring.cloud.stream.bindings.consumer1.group=stream
spring.cloud.stream.bindings.consuemr2.group=stream
spring.cloud.stream.bindings.consumer3.group=stream
spring.cloud.stream.bindings.consumer4.group=stream2
例如这样,就声明了两个消费者组。consumer1,consumer2,consumer3是一个组,consuemr4是另一个组。接下来,可以自行验证一下消息的分发过程。
对于这种分组消费的策略,SCStream框架不光提供了实现,同时还提供了扩展。可以对每个组进行分区(partition,是不是感觉越来越像Kafka了)。
#消息生产者端配置
#启动发送者分区
spring.cloud.stream.bindings.output.producer.partitioned=true
#指定参与消息分区的消费端节点数量
spring.cloud.stream.bindings.output.producer.partition-count=2
#只有消费端分区ID为1的消费端能接收到消息
spring.cloud.stream.bindings.output.producer.partition-key-expression=1
#消息消费者端配置
#启动消费分区
spring.cloud.stream.bindings.input.consumer.partitioned=true
#参与分区的消费端节点个数
spring.cloud.stream.bindings.input.consumer.instance-count=2
#设置该实例的消费端分区ID
spring.cloud.stream.bindings.input.consumer.instance-index=1
通过这样的分组策略,当前这个消费者实例就只会消费奇数编号的消息,而偶数编号的消息则不会发送到这个消费者中。注意:这并不是说偶数编号的消息就不会被消费,只是不会被当前这个实例消费而已。
SCStream框架虽然实现了这种分组策略机制,但是其实是不太严谨的,当把分区数量和分区ID不按套路分配时,并没有太多的检查和日志信息,但是就是收不到消息。另外,在@StreamListener注解中还有condition属性也可以配置消费者的分配逻辑,该属性支持一个SPELl表达式,只接收满足条件的消息。