Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rabbitmq 兔MQ过滤_Rabbitmq - Fatal编程技术网

Rabbitmq 兔MQ过滤

Rabbitmq 兔MQ过滤,rabbitmq,Rabbitmq,我们有一个RabbitMQ交换,它在系统的几个组件之间交换消息 每个组件都是exchange的发布者和订阅者 我们需要找到一种方法来确保每个应用程序不接收它发送到exchange的消息 比如说 应用程序1发送刷新消息。我们希望将此消息发送给除应用程序1之外的所有exchange订户 我可以看到您可以指定路由属性,但这似乎定义了您想要的消息,而不是您不想要的消息 有什么想法吗?RabbitMQ无法直接满足您的要求。这与RMQ的工作方式以及系统的设计方式相比有点落后 也就是说,对于给定的消费者接收到

我们有一个RabbitMQ交换,它在系统的几个组件之间交换消息

每个组件都是exchange的发布者和订阅者

我们需要找到一种方法来确保每个应用程序不接收它发送到exchange的消息

比如说

应用程序1发送刷新消息。我们希望将此消息发送给除应用程序1之外的所有exchange订户

我可以看到您可以指定路由属性,但这似乎定义了您想要的消息,而不是您不想要的消息


有什么想法吗?

RabbitMQ无法直接满足您的要求。这与RMQ的工作方式以及系统的设计方式相比有点落后

也就是说,对于给定的消费者接收到的消息,您不能进行过滤或“选择性”。最终。消息进入队列后,侦听该队列的使用者可能会收到该消息(取决于附加的使用者数量等)

根据我的经验,处理这个问题的最好方法是改变你的RMQ拓扑和应用程序设计,这样就不会出现问题(可能不可能),或者让你的应用程序知道它发送了哪条消息,而忽略它发送的任何信息

我认为第一个选项更好(确保良好的应用程序/拓扑设计不会出现这种情况),但第二个选项通常更容易


为此,您可以向邮件中添加自定义属性,如“publisher-id”或类似属性。请检查您的用户代码,以确保邮件的发布者id与其自己的发布者id不匹配。如果匹配,请确认邮件,不再执行任何操作。如果不匹配,则正常处理消息。

您可以为每个组件分配单独的路由密钥(例如
app1
app2
app3
,…),并将每个组件订阅到除其自身之外的所有其他路由密钥


因此,当应用程序1发送消息时,它将使用路由键
app1
发送消息,但它只订阅了
app2
app3
,…

同意这会起作用,但是我们的应用程序可能会有数百个节点,所以静态定义它们不是一个选项。那么你可能应该使用@Derick Bailey提出的解决方案。至少,我不知道还有其他选择。我确实认为会是这种情况,但我只是想检查一下RMQ中没有什么东西是第一个这样做的。重新设计不是一个选项,因为此消息是一条缓存重置消息,指示数据库已更新,所有节点都应删除其该类型的本地缓存。因此,必须同时订阅和列表是否可以包含来自消费者的一些数据以支持消息?并将其存储在队列中,或进入服务器并存储在数据库中?对于减少测试消费者的镜像流量的情况如何?我们使用了一个上游交换来发布到测试和生产环境,但希望降低成本并从RabbitMQ中过滤出一部分流。