169 похожих чатов

Добрый день коллеги! Подскажите какое решение лучше всего сделать обработку

контактов в БД пакетно, по очереди, в многопотоке. Какие есть бест практик решения? У меня одна БД mysql и несколько серверов php5 которые обращаются к БД. Выборка по часовому поясу

3 ответов

7 просмотров

Вопрос требует конкретизации. Пока это сферический конь в вакууме

Py- Автор вопроса
Slava Rozhnev SQLtest.online https://phpize.online
Вопрос требует конкретизации. Пока это сферический...

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

Py
Нужно вытаскивать из БД контакты пачками условно п...

если вы уж ступили на опасную дорожку реализации очередей на БД, а не через сервер очередей, то надо понимать, что для реализации очереди необходимы какие-то примитивы синхронизации, позволяющее наше многопоточное приложение избавить от гонки состояний - ситуации, когда кто-то что-то не успел обновить. лично я реализовываю очереди на БД так: воркер (процесс, делающий работу - берущий из очереди что надо сделать и складывающий куда-нибудь результат) идёт по такому алгоритму: - берёт какой-нибудь айдишник worder_id - делает выборку записей из таблицы с условием status=fresh, в транзации с SELECT .. FOR UPDATE. Это блокирует строки пессиместично - другие воркеры в это же время выбирающие строки будут ждать. - обновляет выбранные строки, ставя им status=working, worder_id=123, taken_at=NOW() - завершает транзакцию всё, после этого никакой другой воркер не возьмет эти строки, так как они больше не подходят под условие (если после транзакции) или они заблокированы (во время транзакции). теперь можно выполнять работу и обновлять строки. я обычно делаю чтобы воркеры брали строки по одной или небольшими партиями. а также слежу за временем выполнения скрипта и "отпускаю" строки если скрипт не укладывается в ожидаемое время.

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

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

Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
38
Проблема с Windows scripting control Множество объектов получают iDispatch обертки и отдаются в скрипты. При этом скрипты могут эти обертки держать живыми очень долго, наприм...
Arioch The
16
Я тут пытаюсь переработать архитектуру подсистемы памяти ядра во что-то осмысленное. Есть pmm, который создает набор range’ей(пока что только для ядра, потом для юзерспейса), ...
Evg Resh
9
Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
Вот еще криповенькая штука. uMain.pas(517,3) Warning: Case statement does not handle all possible cases И ЧО? 😂
Александр (Rouse_) Багель
20
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
коллеги, а есть простой способ определить, что программу из под Delphi запускают?
Михаил
10
40 тысяч в час / 3600 = 11,11 в секунду... Вам точно нужна очередь? (я просто не знаю "контекста") Такое количество запросов любое приложение замечательно "прожует" и не попер...
Igor Mitin
5
М-да. Почему бы просто со stringlist не работать?
Michael Longneck
23
Карта сайта