Поведение Nats.io QueueSubscribe по таймауту

Я оцениваю NATS для миграции существующего программного обеспечения на основе MSG. Я не нашел документации об исключении и перегрузке MSG. Например:

  • После выбора подписчика известно ли о настройках тайм-аута, опубликованных издателем? Можно ли уведомить о дополнительном продлении времени?
  • Если выбранный подписчик знает, что какое-то соединение с СУБД отсутствует и не может быть завершено, возможно, можно отскочить сообщение

Сервер NATS заберет другого абонента и повторно отправит то же сообщение?

Чао Диего

1 ответ

Решение

По первому вопросу: мне кажется, что вы пытаетесь опубликовать сообщение-запрос с тайм-аутом (используя nc.Request). Если это так, тайм-аут управляется клиентом. По сути, клиент публикует сообщение с запросом и создает подписку на тему ответа. Если подписка не получает никаких сообщений в течение тайм-аута, она уведомит вас о состоянии тайм-аута и откажется от темы ответа.

На ваш второй вопрос - вы используете группу очередей? Группа очередей в NATS - это подписка, в которой указывается имя группы очередей. Все подписки с одинаковым именем группы очередей обрабатываются сервером специально. Сервер выберет одну из подписок группы очередей, чтобы отправлять сообщения между ними по мере поступления сообщений. Однако ответственность сервера заключается в том, чтобы просто доставить сообщение.

Чтобы выполнить то, что вы описываете, реализуйте свои функциональные возможности, используя запрос / ответ, используя время ожидания и максимальное количество сообщений, равное 1. Если по истечении времени ожидания не получено ни одного ответа, ваш клиент может после некоторой задержки повторно отправить сообщение запроса или выполнить какой-либо другой тип логики восстановления. Ответное сообщение должно быть вашим "протоколом", чтобы знать, что сообщение было обработано правильно. Обратите внимание, что это входит в дизайн вашей архитектуры обмена сообщениями. Например, тайм-аут может сработать после того, как получатель запроса получил сообщение и обработал его, но до того, как клиент или сервер смогли опубликовать ответ. В этом случае отправитель запроса не сможет определить разницу и в конечном итоге переиздаст. Это намекает на то, что такой тип взаимодействия должен сделать запросы идемпотентными, чтобы избежать дублирования побочных эффектов.

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