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

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

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

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

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

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

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

9 ответов

17 просмотров

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

Вадим-Светлов Автор вопроса
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 Всем откликнувшимся спасибо за советы!

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

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

Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
Всем привет, есть небольшая проблема Есть такой скрипт document.addEventListener('DOMContentLoaded', function () { const sliderTabs = document.querySelectorAll('.s...
A da
8
@go1337 @dblackCat Привет. Все ещё дрочусь с fastpanel. Добавил второй домен который должен смотреть в рут того же сайта, но так как это просто домен, а не сайт, я не могу ему...
Ross 🦴
9
До речі, в ево нема можливості чи якого розширення щоб з адмінки з телефона зайти і терміново щось в верстці поправити?
Женя
7
кто-нибудь пользуется тайм-трекерами во время работы? так много разных нагуглил, может есть что-то популярное
Lencore
8
Пацаны. Я разрабатываю софт для инвайтинга на телетон, и столкнулся с такой проблемой, в один из чатов не могу приглашать никого, не дает добавлять, в то же время через официа...
Kernel Panic
11
Скажите, а кому нужен Currency как отдельный плагин вместо полноценного ecommerce в OctoberCMS? Кто-то использует его уже или планирует в будущем? Может я что-то не понимаю?
Igor
13
Розмовами про Рево мені нагадали часи, коли шаблони правилися прямо в адмінці. Хто в курсі, чому відійшли від цієї практики, так блейд не працює? Доволі зручно ж було (інколи)
Женя
3
Всем добрый вечер, Рад оказаться в кругу единомышленников. Начинаю погружаться в мир .net веба. Зовут Ерасыл 🖖 У меня назрел вопрос: Какой процент проектов, прошедшие через в...
Ерасыл
6
Чому? Да тому що без GiT не уявляю нормального проекта а коли код в базі то то так собі
Dmytro Lukianenko
3
Карта сайта