Приложение берёт из БД пачку id объектов и проделывает с ними некие вычисления, занимающие до нескольких минут. Сами объекты – набор файлов на диске.
Пора расширяться на несколько серверов. Нужно, чтобы случайно не совпало, и один объект не попал в работу одновременно на нескольких машинах – это приведёт к сбою.
Ещё будут процессы бэкапа, garbage collection / стирания устаревших данных и другие типы работ с объектами, которые так же должны «уважать» эксклюзивную залоченность объекта.
Стек: Linux, PHP, MySQL, Redis.
Пробую просто помещать в set в Redis id объектов, взятых в обработку. Но есть неотловленный пока косяк: иногда эти id зависают в Redis. Видимо, бывает аварийное завершение, при котором не удаляется из набора обработанный id.
Можно завести таблицу в БД, куда заносить id в работе. Менее привлекательно, т.к. задействует диск, в отличие от чисто-памяти Redis.
Как лучше организовать mutex (mutual exclusion, взаимное исключение), «запирание» объектов, которые попадают в работу? Разумно ли использовать свою реализацию, или есть лёгкие/надёжные общепринятые?
Upd. нашёл предложение решения распределённого mutex на Redis.
При установке Bitrix на хостинг появляется следующая ошибка: Для установки продукта в кодировке UTF-8 необходимо установить библиотеку mbstring c параметрами...