Вопрос о коллекциях mongodb + хвостовые курсоры - PullRequest
5 голосов
/ 25 сентября 2011

Я строю систему очередей, которая передает сообщение от одного процесса другому через стек, реализованный в mongodb с capped_collections и настраиваемыми курсорами.

Процессы получения бесконечно циклически ищут новые документы в capped_collection,и когда он находит один, он выполняет операцию.

Мой вопрос: если я реализую несколько процессов приема, есть ли способ гарантировать, что новый документ будет прочитан только один раз одним из процессов с использованием настраиваемого курсора?Цель состоит в том, чтобы избежать выполнения операции дважды, если в очереди два принимающих процесса, ищущих новые сообщения.Я относительно новичок в программировании mongodb, поэтому я все еще чувствую все его возможности.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

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

0 голосов
/ 29 октября 2013

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

Это то, что я придумал: разделить вашу логику на два «модуля». Первый модуль будет отвечать за выборку новых документов из настраиваемого курсора. Второй модуль будет отвечать за работу с произвольным документом. Таким образом, у вас может быть только один потребитель (модуль один), извлекающий документы, который позже отправляет документ нескольким работникам документов (второй модуль).

Оба модуля могут быть реализованы в разных процессах и даже на разных языках. Например, приложение Node.js может извлекать документы и отправлять их в пул сценариев, написанных на Python, готовых к одновременной обработке документов.

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