根本用例
这是典型的 pubsub 用例:假设我们有 M 个新闻源,并且有 N 个订阅者订阅所需的新闻源,并希望获得新闻更新。然而,我们希望这些更新登陆 mongodb - 基本上维护最近的“k”更新(并且可以被索引和搜索等)。我们希望 M 可以扩展到数百万个发布者,N 可以扩展到几百万。
订阅者的更新最终被接收并存储在多个主机及其本机 mongodb 中。
在 rabbitmq 中建模
Rabbitmq 将用于持久化映射(谁订阅了哪个新闻源)。
我以这种方式设置了一个发布订阅系统:我们创建发布者交换(每个映射到一个新闻源)并且类型为“扇出”。
对于建模订阅者,有两种选择。
在第一个选项中,为每个绑定到相关发布者交换的订阅者设置一个队列。并让客户端处理与所有这些订阅者队列的打开连接并接收更新(并将它们持久化到 mongodb)。请注意,在此选项中,当客户端重新启动时,它必须管理所有订阅者的列表,并打开与它负责的所有订阅者队列的连接。
在第二个选项中,我们希望能够消除在启动时必须显式打开每个用户队列的开销。相反,我们只想收听一个队列——代表将向该客户端主机发送更新的所有订阅者。
为了实现这一点,我们首先为每个订阅者创建一个交换器,并让它绑定到它所遵循的发布者交换器。我们为每个客户端设置一个队列,如果订阅者属于该客户端,则让订阅者交换绑定到该队列(类型=直接)。
一旦客户端收到更新消息,它应该知道它来自哪个订阅者交换。只有这样我们才能将它添加到相关订阅者的 mongodb 中。据推测,订阅者交换应该将此信息添加为消息的新标头。
根据 rabbitmq 文档,我相信没有办法实现这一点。(或者更具体地说,从传递的消息中获取“传递路径”属性,我们可以从中获取此信息)。
我的问题:
- 是否可以在消息通过交换时向消息添加新标头?
- 如果这不可能,那我们可以通过自定义交换和相关插件来实现吗?我可以很容易地为此目的使用任何插件吗?
- 我很好奇为什么 rabbitmq 不提供传递路径属性作为可选配置?
- 有没有其他方法可以达到同样的效果?(请参阅下面的 pubsubhubbub 注释)
PubSubHubBub
该用例与 pubsubhubbub 协议提供的非常相似。还有rabbitmq插件也叫rabbithub。但是,我们的系统将是一个封闭的系统,我相信协议的 webhook 方法与单队列监听相比(从性能角度来看)开销太大。