当前位置: 首页 > 知识库问答 >
问题:

如何在RabbitMQ中实现多个用户订阅同一主题并获取同一消息

常献
2023-03-14

首先,我知道这里已经有一个类似问题的答案了,但我仍然不能确定这是因为RabbitMQ的不可能,还是因为我研究得不够。

我来自事件pub/sub模式是这样工作的JS/Node背景:当许多消费者用pub/sub模式订阅同一个主题时,无论何时某个生产者发布它,所有人都应该得到相同的消息。

我希望用消息代理实现相同的模式。

例如:

生产者%1发布到主题“request.user.add”

生产者2发布到主题“request.user.detail”

RabbitMQ的实际操作(根据这个关于主题的RabbitMQ示例)

使用者3获得这两条消息,而使用者1使用者2获得第一条消息,并且只有其中一条获得第二条消息。

我期望实现的

其中三个人同时收到两条信息。

您有没有想法用消息代理(RabbitMQ处于最优先级)来实现这一点?如果我在我的问题中遗漏了什么或不清楚的地方,请指出来。

使用解决方案编辑:

感谢@CantSleepNow,下面是我在他的提示后为消费者1消费者2提供的代码(NodeJS):

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', (err, conn) => {
  conn.createChannel((err, ch) => {
    var ex = 'topic_exchange'; // Exchange name    
    ch.assertExchange(ex, 'topic'); // Exchange with 'topic' type    
    ch.assertQueue('', {exclusive: true}, (err, q) => {
      ch.bindQueue(q.queue, ex, 'request.user.#'); // Topic pattern
      ch.consume(q.queue, (msg) => {
        // Process message
      });
    });
  });
});

共有1个答案

田巴英
2023-03-14

我希望实现的东西
其中三个得到了这两个消息

好吧,只需使用主题exchange并让每个使用者用适当的路由密钥声明它自己的队列。

当您发布时,您正在使用(例如)'request.user.add'发布到主题交换(我们称之为E1),并且所有绑定到具有匹配路由密钥的E1的队列(因为我们在这里讨论的是主题)都将获得该消息。

嗯,我不使用javascript,但我会尝试帮助:)在exclusive中,您是说只有一个使用者可以连接到队列,这是可以的。另外,如果您在每个使用者中创建一个具有唯一名称的队列,您将获得几乎相同的结果(明显的区别是允许其他使用者使用它),在JS中也不知道,但是应该有一种方法,您可以创建一个具有给定名称的队列,或者让服务器返回名称给您。另外,看起来也可以,您只需要测试它。

 类似资料:
  • 我遵循这篇文档来实现上述场景。 那么,有没有人可以建议我如何一次使用多个订阅者从主题中读取消息。

  • 根据官方文档,一旦消息被发送给订阅者,pub/sub就会尝试不将其传递给同一订阅的任何其他订阅者(app2实例是同一订阅的订阅者): 一旦消息被发送到订阅服务器,订阅服务器应该确认该消息。消息一旦发送出去并在订阅者确认之前被视为未完成。pub/sub将反复尝试传递任何未被确认的消息。然而,当一条消息对订阅者来说是未完成的时,Pub/Sub会尝试不将它传递给同一订阅中的任何其他订阅者。订阅服务器有一

  • 我正在尝试设置到系统中所有节点的广播消息。当一个新节点加入系统时,它会向其他所有节点发布一条消息来宣布它的加入。我设计的方式是,存在一个交换,所有节点都将绑定到它自己的队列。每当一个新节点加入系统时,它就会将其队列绑定到exchange并将消息发布到exchange。所有节点都会收到这个消息(包括自身),所有其他节点(除了这个消息)都会发送一个“ACK”消息,这样新节点就会了解系统中可用的节点。但

  • 我有一个spring boot项目,我是spring-kafka来连接底层的kafka事件枢纽。 我不得不在同一节消费者课上听2个不同的话题。我有两种方法可以这样做。 一个是要有两个这样的Kafka听众: 另一种方法是在同一个kafkaListener中有两个主题,如下所示 ===================edit===============application.yml中的Kafka属性

  • 我运行生产者,它生成N条消息,我在仪表板上看到它们。当我运行接收器时,它会接收来自队列的所有消息,并且队列为空。 我需要有多个生产者生成消息到同一个队列。多个客户从队列中接收消息。消息将被队列TTL删除。但是现在第一个接收者从队列中获取所有消息。我怎么能做到这一点?

  • 我有一个websocket服务器和一个websocket客户端,都是Java的。websocket服务器具有以下功能: 在 Java 网页滑板客户端中,我在我的踩踏会话处理程序中提供了以下内容: 然后,我能够通过客户端向服务器路径“hello”发送消息来在两者之间进行通信,然后由于客户端订阅了“topic/greetings”,所以我也要用我的stompFrameHandler来处理响应。 但是我