如何使rabbitmq中的传递路径成为消息属性?

如何使rabbitmq中的传递路径成为消息属性?,rabbitmq,publish-subscribe,websub,Rabbitmq,Publish Subscribe,Websub,不可靠的用例 是典型的PUBSUB用例:考虑到我们有M个新闻源,并且有N个订阅者订阅所需的新闻源,并且谁想要得到新闻更新。但是,我们希望这些更新能够在mongodb中实现—基本上保持最新的“k”更新(并且可以索引和搜索等)。我们希望M的设计规模能达到百万出版商,N的设计规模能达到几百万 订阅者的更新最终被接收并存储在多个主机及其本机MongoDB中 在rabbitmq中建模 Rabbitmq将用于持久化映射(谁订阅了哪个新闻源) 我以这种方式设置了一个pubsub系统:我们创建发布者交换(每个映

不可靠的用例

是典型的PUBSUB用例:考虑到我们有M个新闻源,并且有N个订阅者订阅所需的新闻源,并且谁想要得到新闻更新。但是,我们希望这些更新能够在mongodb中实现—基本上保持最新的“k”更新(并且可以索引和搜索等)。我们希望M的设计规模能达到百万出版商,N的设计规模能达到几百万

订阅者的更新最终被接收并存储在多个主机及其本机MongoDB中

在rabbitmq中建模

Rabbitmq将用于持久化映射(谁订阅了哪个新闻源)

我以这种方式设置了一个pubsub系统:我们创建发布者交换(每个映射到一个新闻源),类型为“fanout”

对于建模用户,有两个选项

在第一个选项中,为绑定到相关发布服务器交换机的每个订阅服务器设置一个队列。并让客户端处理到所有这些订户队列的开放连接,并接收更新(并将其持久化到mongodb)。请注意,在此选项中,当客户端重新启动时,它必须管理所有订阅服务器的列表,并打开与它负责的所有订阅服务器队列的连接

在第二个选项中,我们希望能够消除启动时必须显式打开每个用户队列的开销。相反,我们只想侦听一个队列—代表将向该客户机主机发送更新的所有订阅者

为了实现这一点,我们首先为每个订阅者创建一个exchange,并让它绑定到随后的发布者exchange。我们为每个客户机设置一个队列,如果订户属于该客户机,则让订户交换绑定到此队列(type=direct)

一旦客户端收到更新消息,它就应该知道它来自哪个订户交换机。只有这样,我们才能为相关订户将其添加到mongodb中。据推测,订户交换机应该在消息上添加此信息作为新的头

根据rabbitmq文件,我认为没有办法实现这一点。(或者更具体地说,从传递的消息中获取“传递路径”属性,我们可以从中获取此信息)

我的问题是:

  • 当消息通过exchange时,是否可以向其添加新的标头
  • 如果这是不可能的,那么我们可以通过自定义交换和相关插件来实现吗?有什么插件我可以很容易地用于此目的
  • 我很好奇为什么rabbitmq不提供传递路径属性作为可选配置
  • 有没有其他方法可以达到同样的效果?(见下文PubSubhubbubb注释)
pubsubbub

用例与pubsubb协议提供的非常相似。还有一个名为rabbithub的rabbitmq插件。但是,我们的系统将是一个封闭的系统,我相信协议的webhook方法与侦听单个队列相比(从性能角度来看)开销太大。

消息的生产者(RMQ客户端)应该添加所有必需的头(包括发起者的身份)在RMQ上生成(发布)它之前。这些标头用于路由

如果在传输过程中需要转换消息(包括标头)(例如添加新标头),则需要将其发送到转换器(另一个RMQ客户端)。这个转换器将成为新的出版商

实际消费者应该通过单个队列接收其预期的消息(已订阅)。所有订阅消息的路由应安排在RMQ交换机上


管理最近的“K”更新不应由生产者或消费者负责。因此,它应该在变压器中完成。生产者的消息应该路由到此转换器(用于存储),然后再从消费者消费的地方重新路由到exchange。

我不太了解您的型号。为什么不能有多个订阅者队列?amqp客户端将使用一个队列,使用消息将它们存储在数据库中-代表这些(数千)订阅者。映射都在rabbitmq中持久化。因此,如果系统重新启动,客户端只侦听一个队列,而不是打开数千个到所有单个订户队列的连接。您能否更清楚地描述一下模型背后的基本思想。(你想达到什么,而不是你现在想怎么做。)。我使用Wiktor,这里有些东西没有意义,请将问题指定给我的用例。在发布子设置(即扇出类型交换)中,消息会复制到所有订阅者。所以,在消息中添加一个头文件,告诉它复制到哪个exchange或队列,作为一个配置选项,不是很好吗?(从架构的角度)是否有理由不建议将其作为扩展?