【问题标题】:RabbitMQ: How consumer can do not read some messages?RabbitMQ:消费者如何不读取某些消息?
【发布时间】:2021-11-28 06:50:46
【问题描述】:

如何实现这种方法: 我有多个(3、10、100 等)客户。他们每个人都是生产者和消费者。它们将消息生成到同一个队列(现在可以更改)。消费者应该从除自己的生产者之外的所有生产者那里接收消息。 怎么做?如何排除自己的消息?

【问题讨论】:

  • 最通用的逻辑是检查对象(或对象数组)是否包含具有类似于id 的属性的对象是否匹配任何类似的id 单个用户的属性.如果匹配,请不要对此采取行动,或者只是将其从数组或等效的通用列表中删除。
  • 它们向一个队列生成消息 - 如果您有 3 个队列,每个客户端都生成到自己的特定队列但从不使用它,只有其他两个队列,您实现了什么你想要
  • 抱歉,我的意思是:消息“发送到同一个队列”
  • @ChristopherH。好的,您的意思是:每个客户端从队列中读取所有消息,然后在客户端分析参数是否包含客户端 ID,然后忽略其他使用。
  • @ChristopherH 写下你的答案,我会标记的。

标签: c# rabbitmq


【解决方案1】:

消息在消费者之间是负载平衡的。你不应该使用单个队列,你必须使用 3 个队列来处理你的消息(阅读更多关于可以将你的消息路由到多队列的交换。

【讨论】:

  • 但是每个客户都应该读取来自所有生产者的消息,即来自所有队列中的消息,不包括它播种的消息。如果我有 300 个用户,那将是 300 个队列
  • @ZedZip - 队列相当便宜 - 它不像 messages 被复制到服务器上的每个 - 同样,对于某些用例,您可以使用 temporary 队列(由消费者按需创建并在他离开时自动删除),对于某些用例,您可以使用非持久队列。
  • 另外,@ZedZip - 在您谈到的问题中--> 3 300 任意 数量的客户。你不认为把这个放在你的问题中以便我们可以适当地回答是个好主意吗?现在还为时不晚:您可以编辑您的问题以包含此详细信息以及其他可能重要的信息。
【解决方案2】:

这是topic exchange 的工作(与相关的每个主题队列) - 每个生产者将每条消息标记到队列中,并使用标识它(生产者)的routing key - 路由键可以是多部分的其中一部分标识发布者,其他部分标识您可能想要过滤的其他有用语义。

然后,每个主题队列使用一种模式来准确订阅它想要的消息。每个消费者都订阅了包含所需消息的特定队列。

并且:只有那些它想要的消息才会真正传递给消费者。它不必为它感兴趣的消息支付带宽费用,也不必为 CPU 分配/过滤/丢弃它们。服务器设计就是为了做到这一点,而适当的应用程序设计会利用这一点。

(在这个特定的用例中,每个消费者有一个队列,每个队列为它想要的两个发布者绑定 2 个路由键(即,两个 other 发布者/消费者。在一般情况下是其他可能性。)

exchangesqueues 之间的架构区别绝对是了解如何有效使用 RabbitMQ 的关键 - 以及(某些)其他消息队列系统也是!)

【讨论】:

    【解决方案3】:

    虽然我没有任何代码片段要分享,但基本思想是,无论我们使用什么第三方库来处理自定义数据(在您的情况下是一条消息),数据数组中的每个对象都包含相同的类型,带有一些标识符属性,可以是UserIDMessageIDItemIDDataID 或最常见的UID

    这个 id 可能是由库本身自动生成的,但是,它(数组中的对象又名队列)绝对应该包含您传递给每个对象的数据。在您的数据模型结构中,如果您自己传递一个标识符来唯一地标识您的对象/对象所有者,您始终可以操作您获取的数据数组并遍历嵌套项目,运行您的逻辑以匹配nestedObject.UserID == myUserID .如果匹配,请运行您的逻辑,不要基于该特定数据渲染任何内容,而是渲染来自数据集/数组/队列的其他数据。

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多