Как микросервис Node.js должен пережить перезапуск Rabbitmq? - PullRequest
0 голосов
/ 01 февраля 2019

Я работал над примером использования Rabbitmq для связи между микросервисами Node.js. Я пытаюсь понять, как эти микросервисы могут выжить после перезапуска сервера Rabbitmq.

ПолныйПример доступен на Github: https://github.com/ashleydavis/rabbit-messaging-example

Вы можете запустить систему, перейдя в подкаталог широковещания и используя docker-compose up --build.

При этом я открываю другой терминал и выдаю командуследующая команда для завершения работы сервера Rabbit docker-compose kill rabbit.

Это вызывает необработанное исключение Node.js для уничтожения микросервисов моего отправителя и получателя, которые были подключены к серверу Rabbitmq.

Now I 'Я хотел бы иметь возможность перезапустить сервер Rabbitmq (используя docker-compose up rabbit) и вернуть исходные микросервисы в оперативный режим.

Он предназначен для работы под Docker-Compose для разработки и Kubernetes для производства.Я мог бы просто настроить это так, чтобы микросервисы перезагружались, когда они завершались отключением от Rabbitmq, но я бы предпочел, чтобы микросервисы могли оставаться в сети (они могли выполнять другую работу, которая не должна прерываться), а затем снова подключатьсяк Rabbitmq автоматически, когда он снова станет доступен.

Кто-нибудь знает, как добиться автоматического переподключения к Rabbitmq с помощью библиотеки ampq ?

1 Ответ

0 голосов
/ 11 февраля 2019

Просто выберите сервис отправителя в качестве примера того, как с ним работать.Ошибка, которая приводит к выходу узла, заключается в том, что здесь нет обработчика «ошибки» в потоке пользователя записи.

Если вы измените эту часть кода.https://github.com/ashleydavis/rabbit-messaging-example/blob/master/broadcast/sender/src/index.js#L13

Измените строку в sender / src / index.js с

const messagingConnection = await retry(() => amqp.connect(messagingHost), 10, 5000);

на

const messagingConnection = await retry(() => amqp.connect(messagingHost), 10, 5000)
    .then(x => {
        return x.on('error', (err) => {
            console.log('connect stream on error', err)
        });
    });

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

Аналогичное исправлениедля приемника может применяться

Это полезная справка для случаев, когда узел требует настройки, чтобы не выходить.https://medium.com/dailyjs/how-to-prevent-your-node-js-process-from-crashing-5d40247b8ab2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...