Всем салют, может кто поможет советом или направлением куда копать,

вот в каком вопросе...
Проблема такая, есть сервис на go, запускается скажем в 10 потоков (может сильно больше).
Каждый сервис обрабатывает файл, и нужные данные из него собирает в документ,
а дальше документ вставляет в коллекцию в mongoDB.

У документов есть номер и версия, и перед тем как вставить в монгу, делается запрос по номеру документа.
Если документа нет - идет вставка.
Если есть - сравниваются версии,
если у нового документа версия больше, чем у документа в монге - документ в монге заменяется новым документом (с большей версией).

Но из-за параллельной работы сервисов получается так, что например в нескольких работающих сервисах, одновременно обрабатывается документ с одним и тем же номером,
но разными версиями.
И при поиске (запрос в монгу) все сервисы получают, что документа с таким номером нет,
и все 3 сервиса добавляют один и тот же документ но с разной версией.

пробовал на mongo 4.0, 4.2, 5
Пробовал replaceOne
Индекс есть на номер документа

Пробовал транзакции, не спасают, с разницей от 1 до 150 мс вижу в дате создания документа в коллекции.

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

9 ответов

22 просмотра

привет. что нибудь нашли дельное по своему вопросу?

Вадим-Светлов Автор вопроса
Artemij
привет. что нибудь нашли дельное по своему вопросу...

Привет, нет :( задача перешла в пассивный поиск, но решение очень нужно!

Вадим Светлов
Привет, нет :( задача перешла в пассивный поиск, н...

а триггеры на обновление, вставку не пробовали?

Вадим-Светлов Автор вопроса
Artemij
а триггеры на обновление, вставку не пробовали?

Нет, что-то мне не попалось даже такое Спасибо за наводку, почитаю про них!!!

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

Вадим Светлов
Спасибо! Но

если вы пишите что появляются дубли - значит нет

Вадим-Светлов Автор вопроса
Nick
если вы пишите что появляются дубли - значит нет

а кстати ведь да, верно подмечено!!!

Вадим-Светлов Автор вопроса

Всем привет, не большой апдейт к моему старому вопросу... - По предложению @wayfar8r: Триггеры решили не использовать - По предложению @yatoba: 1."поставить уникальный индекс на номер"... он и правда был но не на уникальность :/ добавил... В этом случае дублей нет, но после обработки задания - находились документы не самой последней версии. 2."все остальное либо транзакции либо upsert при условии что версия дока в базе меньше" (пробовал без уникального индекса) *транзакции - не помогли (дубли находятся), либо их как-то особым образом надо настраивать по части блокировок (возможно недораскурил) и плюс еще получал ошибку (WriteConflict) Plan executor error during findAndModify :: caused by :: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction. Пробовал с опциями по дефолту и с опциями Majority так: sc.StartTransaction(options.Transaction(). SetReadConcern(readconcern.Majority()). SetWriteConcern(writeconcern.New(writeconcern.WMajority())), ) Подсматривал сюда https://github.com/mongodb/mongo-go-driver/blob/v1.9.1/examples/documentation_examples/examples.go не победил ( *upsert - Тоже дубли (пробовал без уникального индекса) Примерный код был таков: mongo.Client.UseSession(cx, func(sc mongo.SessionContext) error { ... opts := options.Replace().SetUpsert(true) result, err := collection.ReplaceOne(sc, query, obj, opts) ... }) Может еще у кого будут идеи? - И на этом вопросе опять хотел остановится. но решил попробовать все в раз применить: уникальный индекс + транзакция c Majority-опциями + replaceOne с upsert:true => x10 потоков и кажется все получилось, дублей понятно нет, но и неактульных версий с ходу не нашел (долго проверять) Может кто чего дополнит/поправит? :) CLUSTER Mongos EDITION MongoDB 5.0.8 Community Всем откликнувшимся спасибо за советы!

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
1. https://www.kaggle.com/code/ahmadrezagholami2001/housing-estimation-linear-regression 2. https://www.kaggle.com/code/ahmadrezagholami2001/uncovering-quality-in-wines-logis...
Ahmadreza
1
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта