Bohdan
Зависит от гарантий, которые вам нужны. Если вам нужна exactly once durable очередь, то в монге это будет сложновато, проще взять готовое решение для очередей.
Если такие жёсткие гарантии не нужны, то наиболее простой способ это использовать локальную очередь с лимитос на размер, откуда треды будут выбирать объекты, а ещё один тред будет туда складывать объекты
Очередь с блокировками это значит, что один поток заполняет ее, потом поочередно потоки выполнения берут оттуда данные и когда очередь будет пуста, она снова заполняется, так?
Bohdan
С гарантией, что два потока одновременно не будут брать оттуда данные
yopp
Да. Это producer/consumer модель. Producer блокируется пока очередь наполнена, consumers блокируются пока очередь пуста или её читает другой consumer или в неё пишет producer
Viktor
Viktor
S
если я использую async await мне нужно во всех запросах к базе добавлять exec()?
yopp
yopp
о чём я и написал
yopp
а чтоб не пытаться изобретать велосипед там, где он не нужен, проще всего использовать готовый примитив
Aleksandr
S
нет
В доке так написано, не догоняю((
This means that you can do things like MyModel.findOne({}).then() and
await MyModel.findOne({}).exec() if you're using async/await.
Aleksandr
зачем догонять тут - попробуй без exec и все
Aleksandr
exec это чтобы колбек передать
Bohdan
Viktor
Viktor
Тебе нужен ConcurrentQueue, хотя б
Bohdan
в документации написано что он thread safe, обобщенный
Vova
Bohdan
Да
Vova
Он не thread safe
Bohdan
Bohdan
а не, это написано про public static
Bohdan
все верно
Vova
Можно сделать доступ через lock
Vova
lock (list)
{
list.Add("item");
}
Bohdan
та не, уже лучше юзать concurrent коллекции
Bohdan
они специально для этого и созданы
Viktor
Bohdan
concurrentbag как альтернатива
Viktor
Bohdan
а порядок мне и не нужен, мне нужно просто все данные с БД обработать
Viktor
Но здесь нужен просто ConcurrentQueue
Bohdan
а почему не bag?
Vova
То может тебе нужен queue а не list/bag
Viktor
Накрайняк, как я выше писал, можно каналами реализовать такое
Vova
Вообще очень классный класс BlockingCollection<T>
Vova
Он тебе больше всего подойдёт если может быть чтение с многих потоков одновременно
Bohdan
там чтение + удаление
Bohdan
поток взял данные, удалил те, что взял
Vova
Bohdan
а когда коллекция пустая - стягиваю новую пачку
Bohdan
@vova_lantsov @ahydrax спасибо большое за идеи, сейчас буду реализовывать
Гена
коллеги, столкнулся с такой проблемой
шардированный кластер, 3 шарда.
В логах сыпит ошибка о том что не может мувнуть чанк, так как есть коллекция с таким же имененем но отличается от UUID материнкого. НО при этом балансер работает и чанки есть в в проблемном шарде
yopp
Гена
Да
yopp
вы с коллекциями делали «да»? 😂
Гена
А, тю)
Гена
Я что не увидел)
Гена
Ничего не делали)
yopp
> В логах сыпит ошибка о том что не может мувнуть чанк, так как есть коллекция с таким же имененем но отличается от UUID материнкого
yopp
или вы неверно читаете лог, или утверждение про «ничего не делали» ложно
Гена
Периодически появляется ошибка, что не может мувнутся чанк из одного шарда в другой. Мы ничего с коллекцией не делали. Очень давно мы вытащили реплики из докеров и объединили их один кластер.
Oleksandr
Добрый день,
Подскажите, пожалуйста в чем может быть ошибка:
https://pastebin.com/ieARyrYD
Гена
yopp
Добрый день,
Подскажите, пожалуйста в чем может быть ошибка:
https://pastebin.com/ieARyrYD
2                         "_id" : 7,
3                         "host" : "yeal-mongo3:27017"
1 //$mngconn = new MongoClient("mongodb://prod-mongo1:27017,prod-mongo2:27017,prod-mongo3:27017/?replicaSet=prod");
Гена
Гугл отказался помогать)
yopp
как вам можно помочь, если вы даже сообщение об ошибке не хотите показать
yopp
yopp
дайвер подключается, получает cluster view с реплики, где yeal-mongo3 и вероятно не может зарезолвить это имя
Bohdan
Skip/Take для монги это тяжелая операция, если речь идет о числах к примеру collection.skip(1500000).take(50)?
Oleksandr
yopp
yopp
как и в любом другом хранилище
Ilya
The cursor.skip() method requires the server to scan from the beginning of the input results set before beginning to return results. As the offset increases, cursor.skip() will become slower.
Ilya
а take это синоним limit в каком то языке или что?
Bohdan
да
Bohdan
она локально вроде как быстро выполняется, я бы сказал очень быстро скипает миллион элементов, но что если придется скипать через каждых 50 элементов целых 2 миллиона, т.е. 1000050 1000100 и т.д.
yopp
yopp
https://scalegrid.io/blog/fast-paging-with-mongodb/
https://www.codementor.io/arpitbhayani/fast-and-efficient-pagination-in-mongodb-9095flbqr
yopp
и ещё дальше
https://www.mongodb.com/blog/post/paging-with-the-bucket-pattern--part-1
Ilya
мы тоже применяем так называемый метод after, для выгребания пачками, описанный в 1 статье под пунктом 2
Bohdan
ух ты, здесь оказывается если перевести айдихи в ObjectId можно с помощью знаков сравнения понять какой объект следующий в хранилище