我正在研究使用nservicebus,并想知道在发布/订阅拓扑中执行以下操作会有多困难。
例如,客户端将订阅用户类型消息。但只订阅这些消息的子集,例如用户密钥为111,222,xxx等的用户消息。
这些密钥子集也会定期更改。
我很难搞清楚NServiceBus是否已经有了处理这个问题的范例?
答案 0 :(得分:4)
没有。这被称为"基于内容的路由",并且它不是NServiceBus支持的东西。虽然NSB支持一些基于代理的传输(例如SQL Server,RabbitMQ),但它在逻辑上设计为分布式模型。为了进行基于内容的路由,需要有一个中央集线器来控制基于内容的消息传递。
Udi Dahan有一篇文章解释了为什么NSB不支持此功能here。
答案 1 :(得分:2)
解决这个问题的方法是考虑用户密钥为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; }
}
现在,您可以为这两个事件创建单独的处理程序。也许您可以通过与上述示例类似的过程来确定如何获得所需的路由行为。