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