假设生产者部署10台,只能1台生产者发送有序,限制这1台的行为,一般业务方怎么去做?或者10台服务方,自动生成不同的消息组来去做。怎么实现 10台机器里面永远只调用同一台?
使用消息组:为了实现有序性,MQ提供了消息组(Message Group)的概念,即相同消息组 ID 的消息会被顺序处理。因此,可以根据需要设置消息组 ID,确保相同消息组 ID 的消息只能由部署在同一台机器上的生产者发送,实现有序消息的发送。同时,每个消费者只订阅一个 Topic 下的某个 Message Group,保证同一个消息组内的消息只会被一个消费者处理。
对于同一个消息组,如果有多个producer可能会产生。那么这个先后顺序是需要这些producer自己协调。mq不理解其中的语义,只能以到达服务端为准。
所以,从定义角度,一个比较严谨保守的说法就是单一producer和server之间的同步通信一定是有顺序意义的。除此之外都是没有意义的,或者说这个意义是业务自己协调。 10台机器里面永远只调用同一台直接注册中心里面就可以搞定,或者zk 分布式锁 。此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”
你好,这种场景可以考虑在RocketMQ中使用消息队列分组(Message Queue Grouping)的功能。具体实现方式是,将有序消息发送到同一个消息队列分组中,然后让这个消息队列分组只在1台生产者上使用。
对于10台机器里面永远只调用同一台的问题,要基于负载均衡的方式来解决。在RocketMQ中,可以使用Namesrv地址列表(Name Server Address List)来实现负载均衡。将10台机器的地址都配置到Namesrv地址列表中,然后在Producer端指定负载均衡算法,让Producer自动选择可用的机器来发送消息。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/