我在系统中有一个Person对象。当某人执行某项操作时,会有一个管理员角色对监视此类事件感兴趣。
Person
{
Id: string
}
PersonAction
{
ActionType: enum
PersonId: string
}
当前,我已经通过ServiceBus主题和订阅实现了此订阅:管理员订阅系统中所有人员的操作:
PersonActions
主题。 PersonAction
事件发送到主题。现在,我有了一个新的要求,即引入人员分组,我需要一种方法,允许管理员根据他们要监视的组来订阅PersonActions事件:
我的想法是如何执行此操作:
因此,考虑到实际情况,我想利用服务总线主题过滤功能将特定的PersonAction消息传递给基于组对它们感兴趣的管理员。
通常,与ServiceBus(或任何其他消息代理)相比,这似乎不是一项简单的任务,因为存在多对多关系:一个人可以在多个组中,并且管理员可能希望订阅多个组。通常,当事件具有单个属性(例如“ groupId = 1234”)并且在我的情况下是数组时,所有过滤器都支持过滤。
到目前为止,我已经提出了两种解决方案,但它们都不尽相同:
使用LIKE SqlFilter。将Person的所有组连接成一个逗号分隔的字符串(groups=1,2,5,8
),然后使用过滤器groups LIKE %1% OR groups LIKE %5%
(实际上,组ID将是guid,因此不要介意一个组ID是另一组的子字符串的问题)
将每个组ID添加为具有空值的属性,然后使用EXISTS过滤器检查事件是否已定义此组ID。过滤器将是EXISTS(1) OR EXISTS(5)
和PersonAction属性:{1:null, 2:null, 5:null, 8:null}
是否有更好的方法来进行此类过滤,以及如何在消息代理中完成多对多过滤规则?
为任何消息代理(不仅是ServiceBus)描述此问题也将非常有帮助。
我对其他代理并不是很熟悉,但是对于Azure Service Bus来说,这是我想到的。
在这种情况下,您可以拥有2(3个带有奖励)等级的实体,而不是1个实体
PersonAction
消息都会进入该主题,并且每个组的订阅都将带有auto-forward设置为其自己的主题您可以删除此级别并进行直接订阅(每个管理员每个组一个,但是可能会点击limit of 2000 subscriptions per topic
[Note如文档的Auto Forward Considerations部分所述,开票的操作数量将增加
这里有更详尽的解释
1。输入主题这是PersonAction
消息首次出现的位置。
此主题将具有基于组的订阅过滤器(您可以采用两种方法;我更喜欢使用Correlation Filter,因为它效率更高,并且希望将auto-forward消息分为各自的主题。
2。每个小组的主题这是按组过滤的PersonAction
消息进入的位置。
这时,将根据用户所属的所有组在不同主题中复制同一封邮件。
管理员将根据需要监视的组来创建所需主题的订阅,但[>必须处理他们可能收到的重复消息。 3。 (奖金)管理员队列