spring-cloud-stream 整合rabbitmq 消息分区

转载 https://blog.csdn.net/qq_41712271/article/details/118297896

消费端消费的负载均衡

目前情况是,如果生产者一下子发送10条消息,在同一个group组的情况下,其中一个消费者可能消费了4条,另一个消费者可能收到 6条

这种情况下需要实现消费者均衡消费
我们可以使用basicQos方法和prefetchCount = 1设置。 这告诉RabbitMQ一次不要向工作人员发送多于一条消息。 或者换句话说,不要向工作人员发送新消息,直到它处理并确认了前一个消息。 相反,它会将其分派给不是仍然忙碌的下一个工作人员。

在消费者上加入:
在这里插入图片描述
意义:实现消息消费的负载均衡

消费分区:消费端消费的顺序消费

但在某些场景下分组还不能满足我们的需求。比如,同时有多条同一个用户的数据发送过来,我们需要根据用户统计,但是消息被分散到了不同的集群节点上了,这时我们就可以考虑使用消息分区了。

实现意义:保证在生产者发送消息有序的情况下,消费者顺序消费

当生产者将消息发送给多个消费者时,保证同一消息始终由同一个消费者实例接收和处理。消息分区是对消息分组的一种补充。

开始配置分区

生产者application.yml配置

server:
  port: 8001 # 端口
 
spring:
  application:
    name: stream-producer # 应用名称
  rabbitmq:
    host: 127.0.0.1  # 服务器 IP
    port: 5672            # 服务器端口
    username: guest       # 用户名
    password: guest       # 密码
    virtual-host: /       # 虚拟主机地址
  cloud:
    stream:
      bindings:
        # 消息发送通道
        smsEmail_out:
          destination: sourceMsg # 绑定的交换机名称
          producer:
            partition-key-expression: payload # 配置分区键的表达式规则
            partition-count: 2 # 配置消息分区的数量

消费者1 application.yml配置

server:
  port: 8002 # 端口
 
spring:
  application:
    name: stream-consumer # 应用名称
  rabbitmq:
    host: 127.0.0.1  # 服务器 IP
    port: 5672            # 服务器端口
    username: guest       # 用户名
    password: guest       # 密码
    virtual-host: /       # 虚拟主机地址
  cloud:
    stream:
      instance-count: 2 # 消费者总数
      instance-index: 0 # 当前消费者的索引
      bindings:
        # 消息接收通道
        smsEmail_in:
          destination: sourceMsg # 绑定的交换机名称
          group: A
          consumer:
            partitioned: true # 开启分区支持
            ```
消费者2 application.yml配置

```yaml
server:
  port: 8003 # 端口
 
spring:
  application:
    name: stream-consumer-2 # 应用名称
  rabbitmq:
    host: 127.0.0.1  # 服务器 IP
    port: 5672            # 服务器端口
    username: guest       # 用户名
    password: guest       # 密码
    virtual-host: /       # 虚拟主机地址
  cloud:
    stream:
      instance-count: 2 # 消费者总数
      instance-index: 1 # 当前消费者的索引
      bindings:
        # 消息接收通道
        smsEmail_in:
          destination: sourceMsg # 绑定的交换机名称
          group: A
          consumer:
            partitioned: true # 开启分区支持

测试
生产者一下子发送10条,只有其中一个消费者可以收到10条
在这里插入图片描述
另外
partition-key-expression 的值也可以为 headers[“xxx”],将由 MessageBuilder 类的 setHeader() 方法完成赋值

source.sendSmsAndEmailOutput().send(MessageBuilder
.withPayload(message)
.setHeader("xxx",0).build());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值