Очередь сообщений на каждого арендатора - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть API, где клиенты отправляют задания асинхронно, которые можно легко разделить на множество небольших задач. Иногда мы получаем больше заданий, чем можем обрабатывать в реальном времени, и поэтому я хочу иметь очередь заданий для каждого клиента, чтобы я мог циклически обрабатывать задания между клиентами. Это так, что если один клиент отправляет гигантскую работу, крошечные задания от других клиентов не должны ждать гигантской задачи.

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

A visual diagram of the description above

Я смотрел на RabbitMQ, но я не нашел способа для потребителя (в данном случае процессора) подписаться на все очереди, соответствующие шаблону, как очереди могут подписаться на обмен.

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

Существует ли посредник очереди сообщений, который можно настроить для выполнения описанного мной?

1 Ответ

0 голосов
/ 16 июня 2019

Невозможно гарантировать однократную обработку в вашем случае. Что должна делать система обмена сообщениями, когда обработка задачи завершена, но из-за аппаратного сбоя подтверждение не доставляется? Он может либо отбросить сообщение (практически потеряв запрос клиента), либо повторно доставить его (что нарушается ровно один раз). Должен быть способ проверить, был ли запрос уже обработан. Это позволит вам сделать задачу обработки идемпотентной.

Кстати, я думаю, что очереди не подходят для вашего случая использования. Ознакомьтесь с Cadence Workflow , который даст вам множество функций и наглядность при обработке прямо из коробки.

Cadence предлагает много преимуществ по сравнению с использованием очередей для обработки задач.

  • Построены экспоненциальные повторы с неограниченным интервалом истечения
  • Обработка ошибок. Например, он позволяет выполнить задачу, которая уведомляет другую службу, если оба обновления не могут быть выполнены в течение заданного интервала.
  • Поддержка длительных операций сердцебиения
  • Возможность реализации сложных задачных зависимостей. Например, реализовать цепочку вызовов или логику компенсации в случае неисправимых сбоев ( SAGA )
  • Обеспечивает полную видимость текущего состояния обновления. Например, при использовании очередей все, что вы знаете, если в очереди есть несколько сообщений, и вам нужна дополнительная БД для отслеживания общего прогресса. С Cadence каждое событие записывается.
  • Возможность отмены обновления в полете.
  • Распределенная поддержка CRON

См. презентацию , которая охватывает модель программирования Cadence.

...