替代基于内容的路由,用于在世界各地区分离任务

时间:2015-10-31 08:46:49

标签: nservicebus masstransit rebus

众所周知,基于内容的路由不受欢迎。应使用消息类型完成路由。但是,如何解决收听队列的服务器在欧盟和欧盟范围内传播的情况?美国地区,我们希望将这些信息传递到适当的地区。

这似乎是基于内容的路由的经典场景:通过添加"区域字段(如在Enterprise Integration Pattern一书中的小部件/小工具示例中)

由于

------------编辑31/10/15 ----------------

回复@mookid,关于rebus解决方案提议:

直到最近,我才知道命令是坏的("破坏架构|)因为我假设发送到端点意味着特定的消费者(通过ip地址)。所以我更喜欢将事件用于所有事情,这就导致了如何解决地区问题的麻烦。

但是现在考虑一下,我可以使用IOrderPlaced接口,并为每条消息创建2个端点:IOrderPlaced_USA,IORderPlaced_EU。 端点的名称将放在app.config中,因此USA服务器将具有与EU服务器不同的app.config。

这将允许我对两个地区使用相同的RabbitMQ服务器,但不允许我从欧盟向美国发送消息 - 这可能是可以接受的 我的理解是正确的吗?

我无法将所有部分组合在一起,您是否可以提供您对所提议的解决方案的比较的看法?

由于

1 个答案:

答案 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是如何做这些事情的,但我相信他们可以用同样的方式做到这一点。