Страницы

Поиск по вопросам

четверг, 21 февраля 2019 г.

Вопрос по поводу очередей в RabbitMQ

Здравствуйте. Я пытаюсь написать очередь на rabbitmq. На всех туториалах которых я смотрел, все работает следующим образом:
Есть код (отправитель), который посылает сообщение в очередь Rabbit'a и сразу завершается. Есть код (получатель), который работает постоянно слушая очередь, чтобы забрать с нее сообщение. После того того как ОН получит сообщение из очереди, есть возможность дать сообщение rabbit'у , что он его получил. И тогда rabbit удалит его из очереди. При этом сам получатель не знает доставлено ли сообщение или нет (оно просто удалилось из очереди).
Но мне этого не достаточно. Мне нужно, чтобы отправитель узнал, что сообщение доставлено.
То есть, попытаюсь привести пример.
Отправитель кладет в очередь два сообщения:
"привет" "пока"
Получатель получил сообщения, и отвечает :
"привет ок" "пока не ок"
Подскажите, можно это реализовать как-то?


Ответ

Вам нужно понять идеологию очередей, как они работают и в первую очередь -- "подтверждение сообщений" (acknowledgement, ack) как описано в этой статье
При выполнении задания - отправлять в другую очередь "задание id=123 выполнено" после успешного выполнения задания.
Плюс опционально:
держать очередь для нотификаций об ошибках периодически проверять "задания, которые зависли более чем на Х минут".
И ещё раз не могу не обратить ваше внимание на то, что у вас ДВЕ очереди сообщений: одна в RabbitMQ, другая - в MSSQL.
Синтетический пример. Допустим, у вас архив страничек в базе MSSQL. И тут же вы добавляете табличку, в которой ставите задания для ботов, которые качают новые статьи. Скачал - добавил новую запись в базу.
Вы сделали избыточную структуру. Можно было обойтись базой в MSSQL и хранить задания ТОЛЬКО в RabbitMQ. И держать сто подписчиков, добавлять и удалять их, чтобы качать быстрее. Обработчик взял задание, обработал, сохранил в базу, пошёл за следующим заданием. Взял другое, ан видит - статья пять минут назад обновлялась, это меньше чем заданный интервал свежести -- удалил из очереди.
Можно было бы не привлекать Rabbit MQ, оставить всё на базе MSSQL.
А у вас две очереди по факту. Такое ну бывает иногда приходится делать, если у вас MSSQL - в одной организации, а Rabbit MQ - это сторонний сервис. Или разные отделы, которые используют разные техологии (одни Linux, другие Windows), бывает и так. Но поскольку я не знаю ваших особенностей -- то просто указываю на излишнее дублировани, вероятно оно вам самому в глаза не бросается.

Комментариев нет:

Отправить комментарий