Bohdan
С гарантией, что два потока одновременно не будут брать оттуда данные
yopp
Да. Это producer/consumer модель. Producer блокируется пока очередь наполнена, consumers блокируются пока очередь пуста или её читает другой consumer или в неё пишет producer
S
если я использую async await мне нужно во всех запросах к базе добавлять exec()?
yopp
о чём я и написал
yopp
а чтоб не пытаться изобретать велосипед там, где он не нужен, проще всего использовать готовый примитив
Viktor
а чтоб не пытаться изобретать велосипед там, где он не нужен, проще всего использовать готовый примитив
Ну версия с использованием локальной очереди (примитива в данном контексте) тоже не будет exactly once, смысл спора тогда?
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 это чтобы колбек передать
S
exec это чтобы колбек передать
ааа получается exec нужен чтобы catch я мог использовать
Bohdan
Ну версия с использованием локальной очереди (примитива в данном контексте) тоже не будет exactly once, смысл спора тогда?
я решил помещать нужные данные в List<T> и с каждого потока брать оттуда определенное кол-во, он thread safe
Viktor
Тебе нужен ConcurrentQueue, хотя б
Bohdan
в документации написано что он thread safe, обобщенный
Bohdan
Да
Vova
Он не thread safe
Bohdan
Bohdan
а не, это написано про public static
Bohdan
все верно
Viktor
в документации написано что он thread safe, обобщенный
Он тредсейф только на чтение, когда его не ресайзят. Все, это единственная его тредсейфовость
Vova
Можно сделать доступ через lock
Vova
lock (list) { list.Add("item"); }
Bohdan
та не, уже лучше юзать concurrent коллекции
Bohdan
они специально для этого и созданы
Vova
та не, уже лучше юзать concurrent коллекции
ConcurrentList не существует, именно потому что это не имеет смысла ведь с lock будет быстрее
Vova
Зато есть concurrentbag
Ага, и порядок не гарантируется
Bohdan
concurrentbag как альтернатива
Bohdan
а порядок мне и не нужен, мне нужно просто все данные с БД обработать
Viktor
Но здесь нужен просто ConcurrentQueue
Bohdan
а почему не bag?
Vova
То может тебе нужен queue а не list/bag
Viktor
Накрайняк, как я выше писал, можно каналами реализовать такое
Vova
Вообще очень классный класс BlockingCollection<T>
Vova
Он тебе больше всего подойдёт если может быть чтение с многих потоков одновременно
Bohdan
там чтение + удаление
Bohdan
поток взял данные, удалил те, что взял
Bohdan
а когда коллекция пустая - стягиваю новую пачку
Vova
а когда коллекция пустая - стягиваю новую пачку
Можно стягивать новую пачку даже пока коллекция не пустая. Если она пустая, то потоки продолжат ждать на TryTake
Bohdan
@vova_lantsov @ahydrax спасибо большое за идеи, сейчас буду реализовывать
Гена
коллеги, столкнулся с такой проблемой шардированный кластер, 3 шарда. В логах сыпит ошибка о том что не может мувнуть чанк, так как есть коллекция с таким же имененем но отличается от UUID материнкого. НО при этом балансер работает и чанки есть в в проблемном шарде
yopp
Ну версия с использованием локальной очереди (примитива в данном контексте) тоже не будет exactly once, смысл спора тогда?
перефразирую: в базах данных не надо и пытаться сделать exactly one очередь. для этого есть специализированные решения. для остальных очередей, без грарантий, гораздо проще использовать готовые примитивы, а базу данных использовать для выборки по простым условиям
Гена
Да
yopp
вы с коллекциями делали «да»? 😂
Гена
А, тю)
Гена
Я что не увидел)
Гена
Ничего не делали)
yopp
> В логах сыпит ошибка о том что не может мувнуть чанк, так как есть коллекция с таким же имененем но отличается от UUID материнкого
yopp
или вы неверно читаете лог, или утверждение про «ничего не делали» ложно
Гена
Периодически появляется ошибка, что не может мувнутся чанк из одного шарда в другой. Мы ничего с коллекцией не делали. Очень давно мы вытащили реплики из докеров и объединили их один кластер.
Oleksandr
Добрый день, Подскажите, пожалуйста в чем может быть ошибка: https://pastebin.com/ieARyrYD
Oleksandr
Добрый день, Подскажите, пожалуйста в чем может быть ошибка: https://pastebin.com/ieARyrYD
Пытался обновить MongoDB PHP Driver до версии 1.6 для теста, не помогло. Чтение документации по составлению URI тоже не помогло, так как несколько раз сравнивал формат
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
дайвер подключается, получает cluster view с реплики, где yeal-mongo3 и вероятно не может зарезолвить это имя
Bohdan
Skip/Take для монги это тяжелая операция, если речь идет о числах к примеру collection.skip(1500000).take(50)?
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
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 можно с помощью знаков сравнения понять какой объект следующий в хранилище