Клиент RabbitMQ подключается к нескольким хостам

Основная цель - иметь несколько хостов серверов RabbiMQ ( кластеризация). Существуют ли передовые практики для реализации нескольких хостов RabbitMQ и повторного подключения к следующему в случае закрытия предыдущего соединения.

Учебник говорит, что:

Клиент может нормально подключаться к любому узлу в кластере. Если этот узел выйдет из строя, а остальная часть кластера выживет, тогда клиент должен заметить закрытое соединение и иметь возможность повторно подключиться к какому-либо выжившему участнику кластера. Как правило, нежелательно запекать имена узлов или IP-адреса узлов в клиентские приложения.

Как это можно реализовать со стороны клиента?

1 ответ

Одним из способов решения этой типичной проблемы является настройка балансировщика нагрузки (этого достаточно в конфигурации "роуд-робин") для вашего кластера (например, HAPROXY, cross-road... или других) .

Клиент (ы)---> IP-нагрузки balacer - БРОКЕРЫ

Таким образом, вы можете использовать только IP-адрес балансировщика нагрузки в подключении вашего клиента.

Для большей гибкости вы можете добавить DNS (локальный DNS), связанный с балансировщиком нагрузки, таким образом вы также можете изменить балансировщик без изменения конфигурации клиента.

клиент (ы)--->- нагрузки balacer-DNSNAME- БРОКЕРЫ

Если один клиент потерял соединение, вы должны повторно подключить его к тому же ip или dns.

У вас должен быть клиент высокой доступности для C#, такой как для java, или просто для управления событием отключения соединения.

Скажем, если у вас небольшой и статичный кластер, вы можете использовать IP-адреса со стороны клиента.

Со стороны клиента (если вы хотите обрабатывать только отключение):

connection = connection = factory.CreateConnection();
channel = connection.CreateModel();
.......
connection.ConnectionShutdown += Connection_ConnectionShutdown;

 void Connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason)
{
    Console.WriteLine("connection_ConnectionShutdown " + reason.ToString());
    Reconnect_client();
}
Другие вопросы по тегам