0

根本用例

这是典型的 pubsub 用例:假设我们有 M 个新闻源,并且有 N 个订阅者订阅所需的新闻源,并希望获得新闻更新。然而,我们希望这些更新登陆 mongodb - 基本上维护最近的“k”更新(并且可以被索引和搜索等)。我们希望 M 可以扩展到数百万个发布者,N 可以扩展到几百万。

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

在 rabbitmq 中建模

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

我以这种方式设置了一个发布订阅系统:我​​们创建发布者交换(每个映射到一个新闻源)并且类型为“扇出”。

对于建模订阅者,有两种选择。

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

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

为了实现这一点,我们首先为每个订阅者创建一个交换器,并让它绑定到它所遵循的发布者交换器。我们为每个客户端设置一个队列,如果订阅者属于该客户端,则让订阅者交换绑定到该队列(类型=直接)。

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

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

我的问题:

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

PubSubHubBub

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

4

1 回答 1

1

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

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

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

管理最后的“K”更新既不是生产者的责任,也不是消费者的责任。因此,它应该在变压器中完成。生产者的消息应该先路由到这个转换器(用于存储),然后再重新路由到消费者消费的交易所。

于 2013-11-26T11:36:38.407 回答