MongoDB как служба очереди? - PullRequest
36 голосов
/ 14 февраля 2012

Мне бы хотелось узнать больше о реальном опыте применения MongoDB в качестве службы очереди. Если бы вы использовали MongoDB для этой цели, не могли бы вы поделиться своими мыслями и средой, в которой они использовались?

Ответы [ 6 ]

41 голосов
/ 14 февраля 2012

Я использую mongodb в качестве службы очереди для отправки электронной почты.Вскоре он будет работать следующим образом:

  1. Когда приходит новое сообщение, я сохраняю его в mongodb.
  2. Фоновое задание затем загружает сообщение из mongodb через атомарную операцию findAndModify и устанавливает флаг Processing в значение true, поэтому он не обрабатывает одно и то же сообщение дважды (поскольку мое фоновое задание запускает несколько потоков параллельно).
  3. После отправки сообщения электронной почты я удаляюдокумент из mongodb.
  4. Вы также можете вести подсчет сбоев для каждого сообщения и удалять его после 3 неудачных попыток.

В общем случае я использую mongodb в качестве службы очереди только для одногопричина: потому что мне нужно отправлять электронные письма по указанному расписанию (каждое сообщение содержит информацию о том, в какое время оно должно быть отправлено).

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

Обновление

Если во время обработки сообщения происходит сбой фонового задания, вы можете выполнить следующее:

  1. Переместить это сообщение в другое, сборник ошибок очереди сообщений или ..

  2. Увеличьте счетчик попыток обработки в сообщении и снова присвойте статус «Новый», чтобы попытаться обработать его снова.Просто убедитесь, что фоновое задание является идемпотентным (может обрабатывать одно и то же сообщение несколько раз и не повреждать данные) и транзакционным (при сбое задания вы должны отменить изменения, которые были внесены. Если таковые имеются).Если после 5 попыток не удается выполнить задание (значение конфигурации), выполните # 1.

  3. Как только ошибка с обработкой сообщений была исправлена, вы можете обработать ее еще раз, присвоив статус «Новый» и перейдя кочереди сообщений, или просто удалите это сообщение.Это зависит от бизнес-процессов на самом деле.

5 голосов
/ 30 января 2014

Я знаю, что этот вопрос вернулся с 2012 года, но во время моего собственного исследования я нашел эту статью и просто хочу сообщить любому другому пользователю, что разработчики из serverdensity заменили rabbitmq в пользу простой системы массового обслуживания с mongodb.

Подробная статья приведена здесь:

https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/

3 голосов
/ 14 февраля 2012

Вот отличная статья , объясняющая, как кто-то использовал оплог репликации mongoDB в качестве очереди.

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

0 голосов
/ 12 июня 2017

Вот моя реализация Python PubSub / queue Он работает либо с помощью хвостового курсора на ограниченном наборе, либо опрашивая нормальный сбор.Использовал несколько проектов, где я хотел упростить свой стек с довольно хорошими результатами.Конечно, как кто-то уже упоминал, пока вы не достигли пределов атомарной находки AndModify, но об этом может позаботиться всякая техника

0 голосов
/ 01 августа 2015

Вот простая очередь сообщений реализация .

Это часть статьи , которая оценивает производительность различных систем очередей сообщений.

Однопоточная установка с одним узлом достигает 7 900 мсг / с и 1 900 мсг / с.

0 голосов
/ 25 июня 2015

Я много искал и нашел версию JavaScript https://github.com/chilts/mongodb-queue. Но я хочу версию Go, поэтому В Go была реализована простая реализация, включающая менеджер для опроса сообщений: https://github.com/justmao945/mongomq

...