众所周知,基于内容的路由不受欢迎。应使用消息类型完成路由。但是,如何解决收听队列的服务器在欧盟和欧盟范围内传播的情况?美国地区,我们希望将这些信息传递到适当的地区。
这似乎是基于内容的路由的经典场景:通过添加"区域字段(如在Enterprise Integration Pattern一书中的小部件/小工具示例中)
由于
------------编辑31/10/15 ----------------
回复@mookid,关于rebus解决方案提议:
直到最近,我才知道命令是坏的("破坏架构|)因为我假设发送到端点意味着特定的消费者(通过ip地址)。所以我更喜欢将事件用于所有事情,这就导致了如何解决地区问题的麻烦。
但是现在考虑一下,我可以使用IOrderPlaced接口,并为每条消息创建2个端点:IOrderPlaced_USA,IORderPlaced_EU。 端点的名称将放在app.config中,因此USA服务器将具有与EU服务器不同的app.config。
这将允许我对两个地区使用相同的RabbitMQ服务器,但不允许我从欧盟向美国发送消息 - 这可能是可以接受的 我的理解是正确的吗?
我无法将所有部分组合在一起,您是否可以提供您对所提议的解决方案的比较的看法?
由于
答案 0 :(得分:0)
当你说“应该使用消息类型完成路由”时,这只是NServiceBus和其他.NET服务总线碰巧鼓励你使用的主要路由策略。
这种策略在很多情况下运作良好,但是有很多情况可以很好地完成你所要求的工作。
由于你用NServiceBus和MassTransit标记了这个问题,我认为你还没有确定一个消息库 - 所以我冒昧地添加了Rebus标签,然后我可以告诉你如何做内容 - 基于Rebus的路由。
假设您要发送DoSomething
消息,并希望根据消息中的某些字段将其路由到两个不同的队列。实现这一目标的一种方法是
await bus.SendLocal(new DoSomething { Region = "US" });
将消息发送到总线自己的输入队列,然后你有一个看起来像这样的处理程序:
public class DoSomethingForwarder : IHandleMessages<DoSomething>
{
readonly IBus bus;
public DoSomethingForwarder(IBus bus)
{
this.bus = bus;
}
public async Task Handle(DoSomething message)
{
var destination = DecideWhereToSend(message);
await bus.Advanced.TransportMessage.Forward(destination);
}
string DecideWhereToSend(DoSomething message)
{
//I'll leave the implementation to you :)
}
}
使用高级API将原始传输邮件路由到另一个目标。
如果您想让路由器更快,更多的机器人更改消息架构,您还可以根据adding a "transport message forwarder" via the routing configuration API的标头值路由消息。
不确定NServiceBus和MassTransit是如何做这些事情的,但我相信他们可以用同样的方式做到这一点。