asp.net-core - RabbitMQ MassTransit 集群问题
问题描述
环境:RabbitMQ 3.8.14
, Erlang 23.2
, Masstrnasit 7.2.2
, Asp.net core 5.0
Windows server 2016
.
我有两个具有名称的节点rabbit@rabbitOne
和rabbit@rabbitTwo
不同的服务器。
根据 RabbitMQ官方文档,我为两个节点设置了相同的 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
节点。我已经看到除了我的 Quorum 队列之外down state
的rabbit@rabbitOne
节点和他的所有队列,它们位于running state
. 但是在这种状态下(rabbit@rabbitOne)MassTransit Bus 无法连接到 RabbitMQ。我得到了例外:“没有一个指定的端点是可达的”。. 我知道什么意思。但我假设这个提示:尽管节点已关闭,但具有仲裁队列的节点必须可用!。
想念我对 RabbitMQ 集群有什么了解吗?我想,我必须在 MassTransit 配置中为 Host 设置另一个值?
connection faild: "rabbitmq://myMlusterName"
rabbit@rabbitOne
rabbit@rabbitTwo
我必须在 RabbitMQ 配置文件中为发现节点设置一个东西吗?或另一个错过理解?
解决方案
仲裁队列需要一个可访问的仲裁,这意味着 3 个节点中的 2 个或 4 个节点中的 3 个等。您不能拥有只有一个节点可用的仲裁队列。它是 (N/2)+1。并且 2/2+1=2。
它在文档中是正确的。
经典 HA 队列适用于单个节点,但如果您不使用暂停少数并手动恢复故障节点,则可能会导致脑裂。
推荐阅读
- c# - 根据条件重新启用按钮 (C#)
- c++ - 使用成员函数为着色器设置矩阵统一时出现间歇性错误
- flutter - Android Studio,Flutter Doctor,未安装插件
- xhtml - 无法打开 xhtml 链接并且找不到文件
- java - 如何在 Appium Java 上使用 setClipboardText
- go - Golang:如何将 float64 货币表示转换为最低面额?(乘以 100 不适用于所有货币)
- javascript - Materializecss 自动完成没有元素出现 1.0.0 没有 jQuery
- generics - 使用 'is' 检查 Dart 泛型的运行时类型
- bash - 特定列的文件 grep
- ios - 尝试播放 url 视频文件时,Swift AVPlayer 不断加载