用于处理来自公共共享服务的事件的NServiceBus模式

用于处理来自公共共享服务的事件的NServiceBus模式,nservicebus,nservicebus-sagas,Nservicebus,Nservicebus Sagas,我们的一些服务在整个系统中共享。例如,跟踪股票走势的工具。每当物品的库存水平发生变化时,就会引发一个事件 我们遇到的问题是,虽然有时另一个服务可能对所有库存更改事件感兴趣(例如进行一些聚合),但在大多数情况下,只有特定操作导致的库存更改才有兴趣 我们现在面临的问题是这个。假设有一个IArticleStockChangedEvent事件,其中包含物品编号、库存更改和请求更改的ProcessId。此事件针对物品库存的每次更改而引发 现在,一些外部服务有一个传奇故事要更改10篇文章,并命令股票服务这样

我们的一些服务在整个系统中共享。例如,跟踪股票走势的工具。每当物品的库存水平发生变化时,就会引发一个事件

我们遇到的问题是,虽然有时另一个服务可能对所有库存更改事件感兴趣(例如进行一些聚合),但在大多数情况下,只有特定操作导致的库存更改才有兴趣

我们现在面临的问题是这个。假设有一个IArticleStockChangedEvent事件,其中包含物品编号、库存更改和请求更改的ProcessId。此事件针对物品库存的每次更改而引发

现在,一些外部服务有一个传奇故事要更改10篇文章,并命令股票服务这样做。它还实现IHandleMessages以跟踪进度。这在理论上很有效,但在实践中,这意味着包含此saga的服务将充斥着不相关的IArticleStockChangedEvent消息,而它将无法找到相应的saga实例。虽然在技术上没有破坏任何东西,但它会在系统中造成不必要的延迟

我并不是真的期待着为每一个可能引起股票变动的传奇故事创造一种新的Iarticlestockchange。处理此问题的建议方法是什么


感谢了解哪些
IArticleStockChangedEvent
事件需要在“外部”服务中交付到您的服务生命周期中,并动态更改,因此不可能(或复杂且不可扩展)在库存服务或传输级别(例如服务总线订阅筛选器)中创建筛选器

< P> >进行优化,即避免<代码> iToStCytoExchange Eng/<代码>的反序列化,您可以考虑“自定义<代码>行为< /代码>,从消息头和查找DB中读取<代码>股票<代码> ID >代码>以查看该股票项目是否有任何传奇,如果没有,则对消息处理进行短路处理。

更好的解决方案可能是使用和回复“代码>股票<代码>服务> ./p>您是否考虑并决定不让SAGA与请求/响应方式交互?如果是这样的话,你能解释一下原因吗?老实说,我已经考虑过了,但有两件事阻碍了我。首先,“StockChanged”事件是相当通用的,其他希望了解所有事件的服务也会使用它。我不确定是否可以“回复”原始服务,但也可以将事件发送给所有其他希望查看所有内容的服务。其次,有一些抽象层。事件来自将事件添加到其内部列表的域聚合。事件实际被调度的那一刻是在代码的另一部分,它不知道情况。从技术上讲,没有什么可以阻止您在给定的消息处理程序中执行回复(可能是不同的消息类型)和发布。但是,是的,抽象层确实会使事情变得更加困难——有时甚至会达到成本大于收益的程度。