Запретить двум экземплярам микросервисов читать один и тот же документ - PullRequest
0 голосов
/ 06 мая 2020

У меня запущено два экземпляра одного и того же микросервиса. Эти микросервисы ссылаются на коллекцию mongodb с помощью библиотеки reactivemon go. Эта коллекция mongodb имитирует очередь. Таким образом, каждый микросервис выбирает последний элемент в очереди, а затем обрабатывает его (не может изменить этот дизайн, поскольку это то, что придумала компания, и они не хотят менять).

Я обеспокоен тем, что два экземпляра выбирают (ie чтение) одного и того же элемента в очереди, а затем начинают обработку на нем. Они сказали, что этого не может произойти из-за свойств атомарности mongodb. Но для меня операции atomi c означают, что работа с базой данных либо произойдет полностью, либо не произойдет вовсе. Итак, как это поможет в описываемом мной сценарии? Я не думаю, что это так.

Они также сказали, что каждый экземпляр, когда он пытается прочитать документ для обработки, если он его находит, он затем обновляет статус с Todo до In-Progress. Они сказали, что это означает, что если появится другой экземпляр, он не получит тот же документ, так как статуса больше нет в Todo.

Похоже, они говорят, что во время этой c операции atomi по обновлению статуса документа с ToDo до In-Progress ни один другой экземпляр не может прочитать ту же строку, даже если обновление не произошло пока что из-за атомарности. Так работает mongodb?

1 Ответ

0 голосов
/ 06 мая 2020

Mon go DB поддерживает блокировку на уровне документа, поэтому вы можете заблокировать строку, чтобы другие службы не перехватили ее. Справочная документация здесь .

Другим решением может быть использование операции findAndModify (), которая позволяет вам атомарно изменять документ. Это немного медленнее, но помогает. Таким образом, вы можете пометить документ в процессе выполнения с помощью findAndModify, чтобы другие службы не перехватили его. Это будет работать, потому что в вашем условии поиска будет только TO-DO.

например

var doc = db.runCommand({
              "findAndModify" : "COLLECTION_NAME",
              "query" : {"_id": "ID_DOCUMENT", "status" : "TO_DO"},
              "update" : {"$set" : {"status" : "IN_PROGRESS"} }
}).value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...