Обнаружение потерянного соединения при публикации и изменении хоста RabbitMQ

Я разрабатываю очень простое приложение с помощью RabbitMQ. Одна машина, несколько очередей и обменов, один издатель и один потребитель. Прочитав дальше о Кластеризация и HA, я подключаю вторую машину для создания кластера, кроме того, я зеркалировал очереди, чтобы иметь хотя бы одну реплику. Теперь, когда я хочу опубликовать некоторые данные в очереди, я использую первую машину в качестве хоста, и она работает нормально, но если служба RabbitMQ первой машины, на которой не запущено мое приложение, вылетела из строя.
Мой вопрос: как узнать, на каком компьютере установлено соединение, и как изменить хост при публикации сообщений?

ОБНОВИТЬ
Я использую одну из перегрузок CreateConnection, чтобы передать все мои хосты для создания соединения. Хорошо, это решит проблему поиска доступной машины для создания соединения. Но второй вопрос все еще существует, посмотрите на код ниже:

for(int i = 0, i < 300, i++){
    var message = string.Format("Message #{0}: {1}", i, Guid.NewGuid());
    var messageBodyTypes = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(ExchangeName, "123456", null, messageBodyBytes);
}

Эти строки кода работают идеально, когда соединение в порядке, но предположим, что в середине публикации сообщений для обмена служба неожиданно остановилась, тогда в этом случае сначала поднялся System.IO.FileLoadException, и если я продолжу выполнение, поднятый RabbitMQ.Client.Exceptions.AlreadyClosedException, который говорит:

Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=320, text = "CONNECTION_FORCED - broker forced connection closure with reason 'shutdown'", classId=0, methidId=0, cause=

Я думаю, должен быть способ изменить хост при закрытии соединения во время публикации сообщений, но как, никакой ИДЕИ!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 850
1

Ответы 1

These lines of code is work perfect when the connection is OK, but assume that in the middle of publishing messages to an exchange, the service stopped unexpectedly, then in this case first System.IO.FileLoadException raised and if I continue the executation RabbitMQ.Client.Exceptions.AlreadyClosedException raised which is saying:

Вы должны закрыть канал и текущее соединение и открывать новое в каждом промежуточном цикле. Это должно использовать другое соединение. Это нужно делать только при обнаружении исключения, а не на каждой итерации цикла.


NOTE: the RabbitMQ team monitors the rabbitmq-users mailing list and only sometimes answers questions on StackOverflow.

Нет, я имею в виду, что когда вы поймаете AlreadyClosedException, вы должны закрыть текущий канал и соединение и заново открыть новое соединение и канал из фабрики соединений. Это нужно делать только при возникновении исключения.

Luke Bakken 02.01.2019 16:16

Другие вопросы по теме