【问题标题】:MassTransit RPC (RabbitMQ) timeout up with multiple clientsMassTransit RPC (RabbitMQ) 与多个客户端超时
【发布时间】:2015-07-05 18:57:39
【问题描述】:

我有两种节点类型。一个Server 和一个Client。将有 1 个或多个 ServerClient 当前正在运行。

使用 MassTransit 和 RabbitMQ,我在尝试here 描述的 RPC 模式时遇到超时。

ServerClient 的代码很简单,用于测试。

Server的代码

class Program
{
    static void Main(string[] args)
    {
        var serviceBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseRabbitMq();
            sbc.ReceiveFrom("rabbitmq://192.168.10.201/mybus_responder");

            sbc.Subscribe(x =>
            {
                x.Handler<TestEvent>((ctx, @event) =>
                {
                    Console.WriteLine("Received message " + @event.Message);
                    ctx.Respond(new TestEventResponse { Response = "Processed message \"" + @event.Message + "\"" });
                });

                x.Handler<TestEvent2>((ctx, @event) =>
                {
                    Console.WriteLine("Received message " + @event.Message);
                    ctx.Respond(new TestEventResponse2 { Response = "Processed message \"" + @event.Message + "\"" });
                });
            });
        });

        Console.WriteLine("Listening for events...");
        Console.ReadLine();
    }
}

Client 的代码

class Program
{
    static void Main(string[] args)
    {
        var serviceBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseRabbitMq();
            sbc.ReceiveFrom("rabbitmq://192.168.10.201/mybus");
        });

        Console.WriteLine("Ready to send events...");

        var eventType = false;

        while (true)
        {
            eventType = !eventType;

            var message = Path.GetFileNameWithoutExtension(Path.GetRandomFileName());

            Console.WriteLine("Sending message " + message);

            if (eventType)
            {
                serviceBus.PublishRequest(new TestEvent {Message = message}, configurator =>
                {
                    configurator.Handle<TestEventResponse>(response =>
                    {
                        Console.WriteLine(response.Response);
                    });
                    configurator.SetTimeout(TimeSpan.FromSeconds(5));
                });
            }
            else
            {
                serviceBus.PublishRequest(new TestEvent2 {Message = message}, configurator =>
                {
                    configurator.Handle<TestEventResponse2>(response =>
                    {
                        Console.WriteLine(response.Response);
                    });
                    configurator.SetTimeout(TimeSpan.FromSeconds(5));
                });
            }
        }
    }
}

如果我只运行每种节点类型中的 1 个,则命令/响应按预期执行。如果我有超过 1 个 Server 实例,则命令/响应按预期执行,在每个 ```Server`` 节点之间平均分配 Client 请求。

但是,如果我有多个 Client 实例正在运行,我将在 ```Client`` 端获得超时。

这是为什么?我需要支持多个 ```Client`` 实例,因为这是我的网络层。

【问题讨论】:

  • 将客户端更改为使用 rabbitmq://192.168.10.201/*?temporary=true,您将获得每个客户端唯一的临时队列。

标签: rabbitmq masstransit


【解决方案1】:

这样做,我相信这仅仅是因为您最终会在实例之间共享一个队列,并且它们会吞噬彼此的消息。每个客户端和服务器都需要一个唯一的队列来读取。

【讨论】:

  • 我不知道 MassTransit 如何让您管理队列。我刚刚在 EasyNetQ 中尝试过,它完美无缺。设置要容易得多。我决定不使用 MassTransit。它适用于与传输无关的实现,但对我来说太固执了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多