首页 文章

如何在rabbitmq中获取传递路径成为消息属性?

提问于
浏览
0

The undelying use case

这是典型的pubsub用例:考虑我们有M个新闻来源,并且有N个订阅者订阅了所需的新闻来源,并且想要获得新闻更新 . 但是,我们希望这些更新以mongodb登陆 - 基本上维护最近的'k'更新(并且可以索引和搜索等) . 我们希望设计M以扩展到数百万个发布者,N可以扩展到几百万 .

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

Modeling in rabbitmq

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

我以这种方式设置了pubsub系统:我们创建发布者交换(每个映射到一个新闻源)和类型'扇出' .

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

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

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

为实现这一目标,我们首先为每个订阅者创建一个交换,并将其绑定到它所遵循的发布者交换 . 我们为每个客户端设置一个队列,如果订户属于该客户端,则让订户交换绑定到此队列(type = direct) .

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

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

我的问题:

  • 是否可以在消息通过交换时为消息添加新标头?

  • 如果这不可能,那么我们可以通过自定义交换和相关插件来实现吗?我可以随意用于此目的的任何插件吗?

  • 我很好奇为什么rabbitmq没有提供传递路径属性作为可选配置?

  • 还有其他方法可以达到同样的目的吗? (参见下面的pubsubhubbub说明)

PubSubHubBub

用例与pubsubhubbub协议提供的用例非常相似 . 还有兔子插件也称为rabbithub . 但是,我们的系统将是一个封闭的系统,我相信协议的webhook方法与监听单个队列(以及从性能角度来看)相比会产生过多的开销 .

1 回答

  • 1

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

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

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

    管理最后的'K'更新既不是 生产环境 者也不是消费者的责任 . 所以,它应该在变压器中完成 . 生产环境 者的消息应该被路由到这个变压器(用于存储),然后再进一步重新路由到消费者消费的交换点 .

相关问题