Параллельная обработка данных MongoDB.Столкновение данных - PullRequest
0 голосов
/ 16 декабря 2018

Я использую mongodb DB.

Проблема : существуют n параллельные процессы, каждый из которых принимает документы с запросом {data_processed: {$exists: false}}, обрабатывает их и обновляет параметр {data_processed:правда}.Когда я запускаю все процессы n, иногда один и тот же документ появляется в двух или более разных процессах.

Я думаю, что могу использовать что-то подобное в запросе, чтобы предотвратить столкновение.

each process have id from 1 to n
for process with id i, get these documents
{
  data_processed: {$exists: false},
  _id: {mod_n: i}
}
where mod_n is Modulo operation on i

Я использую bson ObjectId по умолчанию в качестве _id, поэтому я думаю, что можно сделать что-то вроде этого.

Как я могу реализовать этот запрос?Или вы можете предложить лучший способ решить эту проблему.

1 Ответ

0 голосов
/ 17 декабря 2018

Кажется, что нет простого способа преобразовать ObjectId в long для выполнения операции по модулю.В качестве альтернативы вы можете распределить обработку, используя простое сравнение строк для последнего символа _id или нескольких последних символов, если вам нужно больше потоков,

Например, если вы хотите запустить обработку с использованием процессов 4, вы можете попробоватьследующие запросы:

db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 23, 1 ] }, [ "0", "1", "2", "3" ]  ] } } } ])
...
db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 23, 1 ] }, [ "c", "d", "e", "f" ]  ] } } } ])

Это может масштабироваться до большего числа процессов, если вам нужно больше, чем 16, просто берите последние два символа, например:

db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 22, 2 ] }, [ "00", "01" ]  ] } } } ])

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

3-байтовый счетчик, начиная со случайного значения.

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