【问题标题】:Can MassTransit's In-Memory bus work across processes?MassTransit 的 In-Memory 总线能否跨进程工作?
【发布时间】:2016-01-05 01:52:27
【问题描述】:

我正在尝试使用 MassTransit 的 In-Memory 总线,并尝试修改 Loosely Couple Labs Publish/Subscribe Example 提供的示例,以便从使用 RabbitMQ 到 In-Memory 总线。但是,订阅者似乎没有收到消息。

我使用的是 MassTransit 3.1.2 版。

在 Publisher 中,我将总线创建从:

var bus = Bus.Factory.CreateUsingRabbitMq(x => x.Host(new Uri("rabbitmq://localhost/"), h => { }));

到:

var bus = Bus.Factory.CreateUsingInMemory(x => { });

在订阅者中,我将总线创建从:

var bus = Bus.Factory.CreateUsingRabbitMq(x =>
    {
        var host = x.Host(new Uri("rabbitmq://localhost/"), h => { });
        x.ReceiveEndpoint(host,
                          "MtPubSubExample_TestSubscriber",
                          e => e.Consumer<SomethingHappenedConsumer>());
    });

到:

var bus = Bus.Factory.CreateUsingInMemory(x => x.ReceiveEndpoint("myQueue",
                                                                 e => e.Consumer<SomethingHappenedConsumer>()));

当我运行此代码时,订阅者控制台应用程序没有收到消息。由于我能够在同一个进程中进行环回工作,这让我相信内存总线不会跨进程工作。这是正确的,还是有办法让 In-Memory 总线在同一台机器上的不同进程之间进行通信?

【问题讨论】:

  • 您检查过 RabbitMQ Web 界面以了解发生了什么吗?应该有一个使用默认绑定创建的消息队列。
  • 我专门将 CreateUsingRabbitMq 更改为 CreateUsingInMemory 以创建总线。我想看看 In-Memory 总线是如何工作的,而不是 RabbitMq。因此,RabbitMq 中没有创建消息队列。
  • hmm.. 我认为它应该可以正常工作,因为它是不使用任何持久 MQ 的替代方案(仅推荐用于测试目的)。你在公共汽车上调用 .Start() 吗?请参阅此示例以供参考openstackwiki.org/wiki/…
  • 我看过那个例子,并成功地让它工作。这是发布/订阅在同一个控制台应用程序中的示例。我想看看这是否可以在两个单独的控制台应用程序之间工作。我开始怀疑 In-Memory 总线仅适用于发布者和订阅者使用相同总线实例的情况,因此看起来跨应用程序传输可能不起作用。但是,我希望有人以某种方式给出明确的答案。
  • 内存中的传输只在同一个进程中。无法使用内存中的传输在两个进程之间进行通信。

标签: masstransit


【解决方案1】:

内存中传输设计为仅在单个进程中使用。不能使用内存中的传输在多个进程之间进行通信(即使它们在同一台机器上)。

但是,通过配置传输提供程序,同一进程中的多个总线实例可以共享相同的内存中传输。这在许多单元测试中完成,以验证跨总线实例的行为。

return MassTransit.Bus.Factory.CreateUsingInMemory(x =>
{
    _inMemoryTransportCache = new InMemoryTransportCache(Environment.ProcessorCount);

    x.SetTransportProvider(_inMemoryTransportCache);

    x.ReceiveEndpoint("input_queue", configurator =>
    {
        configurator.Handler<MyMessage>(context => {});
    });
});

InMemoryTransportCache 可以保存并传递给多个总线实例。同样,这都在同一个进程中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多