【问题标题】:RabbitMQ MassTransit Clustering IssueRabbitMQ MassTransit 集群问题
【发布时间】:2021-09-29 11:06:48
【问题描述】:

环境:RabbitMQ 3.8.14Erlang 23.2Masstrnasit 7.2.2Asp.net core 5.0Windows server 2016
我在不同的服务器中有两个名为 rabbit@rabbitOnerabbit@rabbitTwo 的节点。
根据 RabbitMQ official documents,我为两个节点设置了相同的 erlang cookie。并将rabbit@rabbitTwo 节点加入rabbit@rabbitOne 节点。
一切都是正确的。我在 rabbit@rabbitTwo 服务器的 RabbitMQ Mangement UI 中看到了两个节点。
我已经看到属于“rabbit@rabbitOne”的所有队列。
我还创建了一些Quorum Queues 类型的队列。

我使用以下代码配置了 MassTransit:

x.UsingRabbitMq((context, cfg) =>
                {
                    cfg.Host(configuration["clusterName"], opt =>
                    {
              //the host set and test with multiple value; cluster name or host Ip port of the rabbit@rabbitOne node.
  
                        opt.UseCluster(cluster =>
                        {
                            var nodes = configuration["Rabbit:Nodes"].Split(";");
                             //nodes set with Ip port. 
                            foreach (var node in nodes)
                            {
                                if (string.IsNullOrWhiteSpace(node))
                                    continue;

                                cluster.Node(node);
                            }
                        });

                        opt.Username(configuration["Rabbit:UserName"]);
                        opt.Password(configuration["Rabbit:Password"]);
                    });

现在,我将事件发布到队列中。他们正确地工作。

问题
我想simulate high availability,为了这项工作,我手动停止了rabbit@rabbitOne 节点。我已经看到down staterabbit@rabbitOne 节点和他的所有队列,除了我的Quorum 队列,它们都在running state 中。


但在此状态下 (rabbit@rabbitOne) MassTransit Bus 无法连接到 RabbitMQ。我得到了例外:“没有一个指定的端点是可达的”。 connection faild: "rabbitmq://myMlusterName"。 我知道什么意思。但我假设这个提示:尽管rabbit@rabbitOne 节点已关闭,但具有仲裁队列的rabbit@rabbitTwo 节点必须可用!。
想念我对 RabbitMQ 集群有什么了解吗? 我想,我必须在 MassTransit 配置中为 Host 设置另一个值?
我必须在 RabbitMQ 配置文件中为发现节点设置一个东西吗? 还是其他理解失误?

【问题讨论】:

    标签: asp.net-core rabbitmq masstransit


    【解决方案1】:

    仲裁队列需要一个可访问的仲裁,这意味着 3 个节点中的 2 个或 4 个节点中的 3 个等。您不能拥有只有一个节点可用的仲裁队列。它是 (N/2)+1。并且 2/2+1=2。

    我是right in the documentation

    经典 HA 队列适用于单个节点,但如果您不使用暂停少数并手动恢复故障节点,则可能会导致脑裂。

    【讨论】:

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