Re[4]: Message broker for REST API
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.07.21 07:22
Оценка:
Здравствуйте, maxkar, Вы писали:

M>Здравствуйте, gandjustas, Вы писали:


G>>В том и дело, что я хочу функцию надежной доставки возложить на этот брокер, а не городить его в каждом приложении.

M>А не получится "не городить".

Получится. Я напомню что такие продукты существуют. Но они дорогие и тяжеловесные.
Мне в одном проекте даже довелось использовать.

M>Всегда есть проблема надежно доставить сообщение от отправителя для брокера. В момент генерации сообщения может не оказаться сети. Узел брокера может внезапно умереть. На машину с отправителем сразу после коммита в базу данных (или другое persistence storage) может случайно упасть метеорит и докатывать сообщение в брокер придется уже кому-то другому. Именно это и есть основная проблема — надежно доставить от первой точки до существующего решения. А дальше распространение сообщения по цепочке — уже вопрос удобства реализации.


Госпади, как же люди с очередями работают типа rabbitmq... Они ведь тоже могут оказаться недоступны.

Давайте вопрос доступности брокера оставим за кадром.



G>>Тем более я сильно сомневаюсь в квалификации среднего программиста, что он может без ошибок сделать надежную доставку.

M>Значит нужно выбирать одно из решений, которое позволяет упросить кодирование.
Так в этом и вопрос, существует ли такое решение? Я знаю пару очень дорогих. А дешевых\беслатных не видел к сожалению.


M>Можно городить свой удобный велосипед. Под чутким руководством средние программисты такое пишут, проверял. Велосипед в моем стиле работает через основную базу (туда временно пишутся недоставленные сообщения). Библиотека отправки сообщений требует открытую транзакцию, посылает сообщения после коммита. Имеет задачу/поток по периодической докатке сообщений в брокера.

Велосипеды не обсуждаем. Очевидно их можно нагородить.



M>Причем вся эта магия с брокером работает только для ситуаций, когда можно отправить сообщение и забыть про него. К сожалению, во многих случаях нужно надежно продолбиться к конкретному сервису, получить от него ответ и обработать. Там брокер не особо поможет (хотя да, можно и вокруг брокера нагородить...).

Тем не менее использование очередей очень популярно. Внезапно там не надо синхронно получать ответ.


M>В кровавом энтерпрайзе с реальными деньгами такое "отправили и фиг с ним" редко проходит. Как минимум — нужно отправлять такие сообщения в dead letters и потом вручную разбираться.

Так обычно и происходит. Удаленные из очереди складываются в отдельный список "мертвых" сообщений.


M>Плюс есть большая проблема с N. Точнее, с интервалом между первой и последней попытками отправки сообщения. Если это меньше часа — есть хороший шанс потерять сообщения, когда ляжет инфраструктура (сеть, kubernetes, маршрутизация, что там еще любят техопсы). Ляжет cloud provider в отдельной зоне. В потребителе сообщений будет баг, при котором определенные типы сообщений не могут быть обработаны (это, кстати, классный сценарий слить много сообщений в /dev/null до того, как проблема будет обнаружена). А если интервал большой, то какая разница, сколько именно раз повторится сообщение? Опять же, в типичном скучном бизнес-приложении есть большие запасы по нагрузке. В норме (стабильный операционный режим) у вас недоставленных сообщений будет вообще 0. Поэтому банальные мониторинги на очередь повторов/количество запущенных повторов/количество повторов отдельного сообщения дадут повод расставить сигналы (alerts) и в случае срабатывания неторопясь разобраться, почему же до получателся все еще не доходит.

Поэтому во всех взрослых (корпоративных) системах задержка растет экспоненциально. От миллисекунд до часов.


M>Нет, есть сценарии где недоставленные сообщения — это нормальный и ожидаемый режим работы. Но таких мало относительно общей массы.

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

M>>>Это очень сложно в ситуации с "зависимыми entities"

G>>Вообще без разницы честно говоря.
M>А зачем вы тогда ниже жалуетесь, что все решения — сложные?
В том решении, которое я хочу видеть не продполагается "зависимых entities". Представьте себе rabbitmq, но сообщения доставлюся REST запросами на указанные эндпоинты получателя и отправляются также REST запросами на эндпоинты очереди. Вот такое решение хочу видеть. Готовое. Без самописных велосипедов и своих протоколов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.