Open freewms opened 5 years ago
@freewms Опишите пожалуйста сценарий, когда это могло бы быть полезно (получать и подтверждать сообщения пачками)?
Например сейчас в Адаптере в каждом из потоков мы получаем одно сообщение, загружаем его в базу, и затем подтверждаем. Т.е. в этом сценарии вроде нет необходимости в получении и подтверждении сразу нескольких сообщений.
Я рассматривал возможность использовать компоненту как внешний регистратор событий. В случае, когда обработка событий связана с запросами - удобнее погрузить стоящие в очереди сообщения массивом в запрос и отфильтроваться. Иначе получается весьма ресурсоемко.
Для этого можно использовать локальные очереди
Что есть "локальные очереди"?
@freewms Если Источник сообщений генерирует много сообщений (событий), а получателю нужна только часть, то обычно:
По нашему опыту можно настроить заполнение ключа маршрутизации и правила маршрутизации так, чтобы можно было отсеить все "не нужные сообщения".
Но если это не удается ("просачивается" небольшое количество "не нужных сообщений") то мы загружаем сообщения по одному (как обычно) и подтверждаем без обработки (т.к. их немного, это не является проблемой)
Само собой, ключи маршрутизации использую, Кролик достаточно умен для того что бы хорошо с этим справляться. Однако иногда нужна именно блоковое получение сообщений, потом обработа на стороне приемника блока целиком (в результате обработки могут возникать различные исключения, в т.ч. по превышению расхода памяти, например), а потом по результату обработки хочется отправить ack что бы удалить блок из очереди. В целом, это позволит сделать систему с отрицательной обратной связью: сорвалась обработка блока -> уменьшили размер пачки -> повторили попытку обработки. При плавающей нагрузке на систему удобный функционал весьма, на мой вкус.
В целом протокол AMQP позволяет сделать пакетное подтверждение сразу нескольких сообщений. Либы, которая используется в основе компоненты тоже. Вполне себе технически реализуемо и костылей городить не придется.
@freewms "Однако иногда нужна именно блоковое получение сообщений" приведите пожалуйста пример (нам нужно понять, нужно ли нам это в адаптере, чтобы принять решение, делать ли нам это самим)
В случае, если сообщения обрабатываются пачками по N сообщений, возникает потребность обеспечить подтверждение окончания обработки сразу нескольких сообщений. Сейчас это реазиуется путем запроса N сообщений, обработки на стороне потребителя, потом повторного получения с отправкой подтверждения на каждое сообщение.