一个rebus进程中有多个输入队列

时间:2014-10-01 16:06:10

标签: rebus

我正在写一个"多工人"使用top-shelf和rebus的应用程序。

我的想法是使用MyWorker1Namespace - MyWorker1Namespace.MessagesMyWorker2Namespace - MyWorker2Namespace.Messages模式。

我想在不跨越多个进程的情况下运行应用程序,而是希望使用多个输入队列配置应用程序,以便在必要时准备将其拆分为多个进程。

有没有办法在一个应用程序中使用Rebus声明多个输入队列和多个工作线程?

我猜配置应该是这样的:

<rebus inputQueue="MyWorker1Namespace.input" errorQueue="MyWorker1Namespace.error" workers="1" maxRetries="5"> </rebus>
<rebus inputQueue="MyWorker2Namespace.input" errorQueue="MyWorker2Namespace.error" workers="1" maxRetries="5"> </rebus>
...

1 个答案:

答案 0 :(得分:8)

由于Rebus app.config XML针对one-bus-instance-per-processes场景进行了优化,因此无法在XML中配置多个完全的总线,但没有任何东西可以阻止您启动同一进程内的多个总线实例。

我经常这样做,例如在我希望托管多个逻辑端点的Azure工作者角色中,而不会产生物理上单独部署的成本,我有时也会使用Topshelf托管的Windows服务完成它。

通常,我的app.config最终会得到以下XML:

<rebus workers="1">
    <add messages="SomeAssembly.Messages" endpoint="someEndpoint.input"/>
    <add messages="AnotherAssembly.Messages" endpoint="anotherEndpoint.input"/>
</rebus>

因此允许我一次性配置每个总线的默认工作数和端点映射。然后,当我的应用程序启动时,它将在应用程序生命周期内为每个总线保留一个IoC容器 - 对于Windsor,我通常最终会得到一个具有队列名称参数的通用总线安装程序,这允许我配置Windsor像这样:

var containers = new List<IWindsorContainer> {
    new WindsorContainer()
        // always handlers first
        .Install(FromAssembly.Containing<SomeEndpoint.SomeHandler>())

        // and then the bus, which gets started at this point
        .Install(new RebusInstaller("someEndpoint.input", "error"))

        // and then e.g. background timers and other "living things"
        .Install(new PeriodicTimersInstannce()),

    new WindsorContainer()
        .Install(FromAssembly.Containing<AnotherEndpoint.AnotherHandler>())
        .Install(new RebusInstaller("anotherEndpoint.input", "error"))
};

// and then remember to dispose each container when shutting down the process

其中RebusInstaller(这是一个Windsor机制)基本上只是将具有正确队列名称的总线放入容器中,例如像这样:

Configure.With(new WindsorContainerAdapter(container))
    .Transport(t => t.UseMsmq(_inputQueueName, _errorQueueName))
    .(...) etc
    .CreateBus().Start();

我喜欢这样的想法,即每个IoC容器实例本身都是一个逻辑上独立的应用程序。通过这种方式,如果你想要在未来的某个时间将它分开是很容易的。能够独立部署您的终端。

我希望这能为您提供一些灵感:)请不要犹豫,询问您是否需要更多指示。