Message Broker中的很多过滤

问题描述 投票:1回答:1

我在系统中有一个Person对象。当某人执行某项操作时,会有一个管理员角色对监视此类事件感兴趣。

Person
{
   Id: string
}
PersonAction
{
   ActionType: enum
   PersonId: string
}

当前,我已经通过ServiceBus主题和订阅实现了此订阅:管理员订阅系统中所有人员的操作:

  • Azure Service Bus代理具有PersonActions主题。
  • 每次Person执行任何操作时,都会将PersonAction事件发送到主题。
  • 每个管理员都创建自己的主题订阅,并监视所有人员操作。

现在,我有了一个新的要求,即引入人员分组,我需要一种方法,允许管理员根据他们要监视的组来订阅PersonActions事件:

  • 人可以是一个或多个组的一部分。
  • 管理员对监视人员组感兴趣,因此收到了他们所监视的组的所有PersonAction事件。
  • 管理员可以订阅一个或多个组。

我的想法是如何执行此操作:

  • 向PersonAction添加一个路由属性,其中将包含有关此Person所属的组的信息
  • [当管理员创建新订阅时,他将指定一组他想监视的组,并且应该以某种方式在订阅过滤器中使用该组过滤主题中的PersonAction消息。

因此,考虑到实际情况,我想利用服务总线主题过滤功能将特定的PersonAction消息传递给基于组对它们感兴趣的管理员。

通常,与ServiceBus(或任何其他消息代理)相比,这似乎不是一项简单的任务,因为存在多对多关系:一个人可以在多个组中,并且管理员可能希望订阅多个组。通常,当事件具有单个属性(例如“ groupId = 1234”)并且在我的情况下是数组时,所有过滤器都支持过滤。

到目前为止,我已经提出了两种解决方案,但它们都不尽相同:

  1. 使用LIKE SqlFilter。将Person的所有组连接成一个逗号分隔的字符串(groups=1,2,5,8),然后使用过滤器groups LIKE %1% OR groups LIKE %5%(实际上,组ID将是guid,因此不要介意一个组ID是另一组的子字符串的问题)

  2. 将每个组ID添加为具有空值的属性,然后使用EXISTS过滤器检查事件是否已定义此组ID。过滤器将是EXISTS(1) OR EXISTS(5)和PersonAction属性:{1:null, 2:null, 5:null, 8:null}

是否有更好的方法来进行此类过滤,以及如何在消息代理中完成多对多过滤规则?

为任何消息代理(不仅是ServiceBus)描述此问题也将非常有帮助。

rabbitmq message-queue azureservicebus
1个回答
0
投票

我对其他代理并不是很熟悉,但是对于Azure Service Bus来说,这是我想到的。

在这种情况下,您可以拥有2(3个带有奖励)等级的实体,而不是1个实体

  1. 第一级是一个主题,所有PersonAction消息都会进入该主题,并且每个组的订阅都将带有auto-forward设置为其自己的主题
  2. 第二级是每个组都有其自己的主题,管理员将根据他们要监视的组订阅多个主题但是必须删除重复消息

    您可以删除此级别并进行直接订阅(每个管理员每个组一个,但是可能会点击limit of 2000 subscriptions per topic

  3. ((Bonus) Auto Forward来自订阅的消息进入管理员队列并启用Duplicate Detection

[Note如文档的Auto Forward Considerations部分所述,开票的操作数量将增加


这里有更详尽的解释

1。输入主题这是PersonAction消息首次出现的位置。

此主题将具有基于组的订阅过滤器(您可以采用两种方法;我更喜欢使用Correlation Filter,因为它效率更高,并且希望将auto-forward消息分为各自的主题。

2。每个小组的主题这是按组过滤的PersonAction消息进入的位置。

这时,将根据用户所属的所有组在不同主题中复制同一封邮件。

管理员将根据需要监视的组来创建所需主题的订阅,但[>必须处理他们可能收到的重复消息。

3。 (奖金)管理员队列

可以将管理员创建的订阅设置为auto-forward消息进入其个人队列,并且这些队列可以启用duplicate detection,以允许管理员按原样自由处理消息,而不必担心重复。

© www.soinside.com 2019 - 2024. All rights reserved.