SpringCloud Stream消息分组
消息分组有2个好处,分别是集群合理消费、数据持久化。
集群消费下的分组
1)分组的意义
分组在项目中是有非常重大的意义,通常应用于消息并发高、消息堆积的场景,这些场景服务消费方通常会做集群操作,一旦做集群操作,我们又需要项目中的消费者合理消费,比如用户打车支付完成后,我们需要增加用户积分同时修改订单状态,如果集群环境中有2台服务器都执行该消费操作,此时用户积分会增加两次,就会造成非幂等问题。
此时集群中相同服务应该属于同一个组,同一个组中只允许有一个主节点消费某一个信息,这样就可以避免非幂等问题的出现。
2)分组实战
项目结构图:
我们将两个order服务都运行起来。此时运行起来,18082
和18182
节点会同时消费所有数据。
修改hailtaxi-order
、hailtaxi-order1
的核心配置文件application.yml
,添加分组:
3)测试
启动pay,order,order1三个服务,调用pay的支付方法。会给mq中发送一条消息。
我们来访问http://localhost:18083/pay/wxpay/1
。
我们发现只会有一个order节点去消费数据
数据持久化
我们把分组去掉,停掉hailtaxi-order
服务,然后请求http://localhost:18083/pay/wxpay/1
发送数据,发送完数据后,再启动hailtaxi-order
服务,此时发现没有数据可以消费,这是因为数据没有持久化,是一种广播模式。
如果需要数据持久化,得给每个消费节点添加group组即可。这样的话,就算发送方发送消息时候接收方不在线,再等接收方上线的时候接收方依旧能接受到消息