2016-11-17 20 views
1

活動,是有辦法來訂閱具有特定屬性值的事件?例如,只能訂閱OperationTypeId = 3的事件。NServiceBus:訂閱與鑑於以下事件特定屬性值

public interface IServerEvent : IEvent 
{ 
    int OperationTypeId { get; set; } 
    string SomeValue { get; set; } 
} 

我正在使用NServiceBus 6.0.0。

的應用案例,這是新的OperationType的可以在服務器上創建,所以我們需要一個「通用」的事件結構。我想爲訂閱者只接收事件的OperationType的他們有興趣,而不是要求發行人的所有事件發送給所有用戶,並讓用戶過濾器的能力。

我希望NServiceBus的發佈方可以處理的過濾器,以減少發佈事件的數量。

回答

1

不開箱 - 但如果你正在使用的RabbitMQ爲你的後臺,你可以用OperationTypeId的路由鍵使用IRoutingTopology路由的具體消息。然後,您可以對您的用戶相同的拓撲訂閱只有特定的路由鍵

+0

我們會檢討的RabbitMQ作爲一個解決方案,以及。感謝您的建議。 –

+0

AFAIK - 這是你可以做你想做的,如果如上用戶建議您如不能改變的唯一方式。 NSB在不允許基於上下文的路由方面很重要,但是在使用RabbitMq時存在一個漏洞。 – Charles

1

布賴恩, 在正確的以前的答案中,通常你會區分按類型或接口等不同的內容,只訂閱的類型所以發佈商可以區分。

另一個想法可能是圍繞這些是否活動?如果你堅持一個通用的消息,其中的內容不能被強類型的,可以動態改變,你可能要放棄內置的基於類型的路由和管理自己的信息分配。然後,您可以使用命令並分配它們,但是您希望在示例中的OperationTypeId上使用基於內容的路由器。

較新的還是有6個版本的一些客戶的路由功能,可以讓你在這裏的一些潛在的靈活性:看到這篇文章,例如:https://docs.particular.net/samples/routing/custom/

問候, 喬

+0

喬,如果我沒有理解錯的,這個解決方案將非常需要和結構變化,將使該路由器的樞紐。如果這是最好的方法,我們最終可能會用像兔子MQ這樣的東西,我也需要審查。感謝您的文章! –

4

什麼是訂閱到的缺點只針對那些符合你的標準而忽略其他標準的事件?

如果您是發佈端的控制,如果有一個特定的值這些事件意味着什麼的業務,也許你需要打破通用事件併發佈一個更細的晶粒的呢?

至於爲什麼NServiceBus不支持基於內容的路由,也許this是從原作者很好看的?

TL; DR 「因爲它通常應避免的危險模式」

+0

哈迪,感謝您的文章,我明白你的觀點和烏迪的。我正在研究一個重視靜態消息靈活性的系統,我不一定同意但需要了解雙方。 –