使用 nservicebus 订阅特定的消息类型

using nservicebus to subscribe to a specific message type

我正在研究使用 nservicebus 并想知道在 publish/subscribe 拓扑中执行以下操作有多难。

例如,客户端会订阅用户类型的消息。但只订阅这些消息的一个子集,例如用户密钥为 111,222,xxx 等的用户消息

这些密钥子集也会定期更改。

我很难确定 NServiceBus 是否已经有一个范例来处理这个问题?

没有。这叫做 "Content-Based Routing",它不是 NServiceBus 支持的东西。尽管 NSB 支持一些基于代理的传输(例如 SQL Server、RabbitMQ),但它在逻辑上被设计为分布式模型。为了进行基于内容的路由,需要有一个中央集线器来控制基于内容的消息传递。

Udi Dahan post 解释了为什么 NSB 不支持此功能 here

解决这个问题的方法是考虑 material 用户密钥为 111 或 222 的用户消息与不是这种情况的用户消息有什么区别。

可能的结论是,它们实际上代表您的业务流程中的不同事物,因为一个将以不同的效果被使用。这是一个信号,表明您实际上需要创建新的消息类型来区分这些不同的业务案例。

例如,假设您有以下事件消息:

public interface IUserAddedInformation
{
    Guid UserKey { get; set; }
    InformationType informationType { get; set; }
}

public enum InformationType 
{
    Address,
    CreditCard
}

您设置了一个订阅者来处理消息并处理更改。但是,您很快就会意识到地址等个人数据和信用卡详细信息等支付数据非常不同,因此您希望分别处理这两种情况。但是如果不根据消息中的 informationType 字段进行路由怎么办呢?

public interface IUserAddedCreditCard
{
    Guid UserKey { get; set; }
}

public interface IUserAddedAddress
{
    Guid UserKey { get; set; }
}

现在您可以为这两个事件创建单独的处理程序。也许您可以通过与上述示例类似的过程来弄清楚如何获得您需要的路由行为。