RabbitMQ - 如何避免接收自己的消息

时间:2017-02-04 19:54:42

标签: rabbitmq amqp

我正在创建一个服务(可通过网络和应用访问),用户属于一个团队。每当用户执行某事时,必须通知他/她团队中的所有其他在线用户(*)。我正在评估RabbitMQ。

(*)请注意,同一个用户可能同时有多个会话:他可以同时登录不同的浏览器,或者更有可能同时登录浏览器和应用程序。

我目前的方法是为每个团队创建一个主题交换:

  • 当用户登录时,会创建一个自动删除队列并绑定到他/她团队的交换。
  • 当用户进行更新时,后端会向相应团队的交换机发送消息。
  • 最后,所有活动队列 - 即所有活动会话 - 都会收到更新消息。

这很好,因为更新消息只能由后端发送一次。但是,这里的问题是发起者也接收他自己的更新。我想避免这种情况。那可能吗?或者我应该有另一种设计吗?

当然,我总是可以在更新消息的有效载荷中添加发起者的用户标识符,并在收到更新消息时对该字段进行过滤,但仍然会收到该消息。

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。在考虑了这个特定设计的一段时间之后,当用户想要获得更新并进行一些更改而其他人应该知道它时,我觉得你需要考虑其他一些设计。

使用Topic作为Exchange,您将始终在登录系统时创建队列时收到通知。主题将广播它。

主题更多的是订阅类型的东西,你不能轻易指定你想跳过一个订阅的位置。

我能想到的一个有点复杂的设计如下:

  1. 在团队中为每个人创建一个主题交换。
  2. 当其他用户登录时,他将订阅所有其他团队成员的交换。
  3. 当用户进行更新时,会将其发送到他自己的Exchange,其他所有人都在收听。
  4. 这样,用户在收听其他主题时就不会获得自己的更新。