Как задизайнить job queue?

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

Рассматривал вариант с кафкой, но как сделать задержку 10 минут и как не обрабатывать старые сообщения не понятно

Есть вариант с редисом, но эта очередь может стать очень большой и не влезет в оперативную память

Был вариант с постгресом(или иной) и блокировкой таблицы, но при нагрузках блокировки плохо скажутся на производительности

Какое идеальное решение в этой задаче?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
Думаю, при получении сообщений необходимо сохранить в СУБД тело сообщения, id (UUID?), timestamp. При наличии существующего id просто обновить timestamp.
Некоторый сервис может с частотой 1 Гц проверять наличие записей, у которых timestamp подпадает под условие "которое находится в очереди как минимум 10 минут" и всех их отправлять в брокер сообщений и удалять/помечать как удалённые.
Таким образом, обработчики очереди берут из очереди только сообщения, для которых пришло время обработки.
Если темп отправки брокеру сообщений умеренный, нет смысла использовать Kafka. Возможно, достаточно и RabbitMQ. Главное, чтобы очередь не росла и обработчики успевали опустошать её.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы