首页 > 解决方案 > 用于处理来自公共共享服务的事件的 NServiceBus 模式

问题描述

我们有一种情况,我们的一些服务在我们的系统中共享。例如,跟踪股票走势的一种。每当文章的库存水平发生变化时,就会引发一个事件。

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

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

现在一些外部服务有一个 saga 来改变 10 篇文章,并命令 stock 服务来做到这一点。它还实现了 IHandleMessages 来跟踪进度。这在理论上很有效,但实际上这意味着包含此 saga 的服务将被不相关的 IArticleStockChangedEvent 消息淹没,它将无法找到相应的 saga 实例。虽然在技术上没有破坏任何东西,但它会导致系统不必要的延迟。

我并不真的期待为每个可能导致股票变化的传奇创建一种新的 IArticleStockChangedEvent。处理此问题的推荐方法是什么?

谢谢

标签: nservicebusnservicebus-sagas

解决方案


关于IArticleStockChangedEvent您需要将哪些事件传递给您的服务的知识存在于您的“外部”服务中并动态变化,因此不可能(或者复杂且不可扩展)在 Stock 服务或传输级别进行过滤器(例如,服务总线订阅过滤器)。

要进行优化,即避免反序列化IArticleStockChangedEvent,您可以考虑自定义从消息头Behavior<IIncomingPhysicalMessageContext>读取Stock项目的位置Id并查找数据库以查看该库存项目是否有任何传奇,如果没有,则缩短消息处理。

更好的解决方案可能是使用回复并回复来自Stock服务的消息。


推荐阅读