BITERP / PinkRabbitMQ

Внешняя Native API компонента для взаимодействия с RabbitMQ из 1С
MIT License
264 stars 107 forks source link

Добавить возможность подтверждения последний N сообщений из очереди. #4

Open freewms opened 5 years ago

freewms commented 5 years ago

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

Begemoth2 commented 5 years ago

@freewms Опишите пожалуйста сценарий, когда это могло бы быть полезно (получать и подтверждать сообщения пачками)?

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

freewms commented 5 years ago

Я рассматривал возможность использовать компоненту как внешний регистратор событий. В случае, когда обработка событий связана с запросами - удобнее погрузить стоящие в очереди сообщения массивом в запрос и отфильтроваться. Иначе получается весьма ресурсоемко.

asosnoviy commented 5 years ago

Для этого можно использовать локальные очереди

freewms commented 5 years ago

Что есть "локальные очереди"?

Begemoth2 commented 5 years ago

@freewms Если Источник сообщений генерирует много сообщений (событий), а получателю нужна только часть, то обычно:

  1. При отправке сообщений заполняют в них ключ маршрутизации
  2. Делают для такого получателя отдельную очередь
  3. Настраивают для этой очереди правила маршрутизации (bindings), так чтобы в нее приходили только нужные сообщения
  4. Получают все сообщения из очереди без фильтрации

По нашему опыту можно настроить заполнение ключа маршрутизации и правила маршрутизации так, чтобы можно было отсеить все "не нужные сообщения".

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

freewms commented 5 years ago

Само собой, ключи маршрутизации использую, Кролик достаточно умен для того что бы хорошо с этим справляться. Однако иногда нужна именно блоковое получение сообщений, потом обработа на стороне приемника блока целиком (в результате обработки могут возникать различные исключения, в т.ч. по превышению расхода памяти, например), а потом по результату обработки хочется отправить ack что бы удалить блок из очереди. В целом, это позволит сделать систему с отрицательной обратной связью: сорвалась обработка блока -> уменьшили размер пачки -> повторили попытку обработки. При плавающей нагрузке на систему удобный функционал весьма, на мой вкус.

ripreal commented 5 years ago

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

Begemoth2 commented 5 years ago

@freewms "Однако иногда нужна именно блоковое получение сообщений" приведите пожалуйста пример (нам нужно понять, нужно ли нам это в адаптере, чтобы принять решение, делать ли нам это самим)