oldarkin
@oldarkin
Кодить, тестить, дебажить!!

Как одновременно работать с одной папкой двум копиям приложения?

Есть сетевая папка, в которую пользователи кладут документы для обработки, есть приложение, которое опрашивает папку каждые N секунд и берет документы на обработку (параллельно перемещая по папкам внутри главного каталога)
Приложение живет в Linux сервисе в докере.
Суть вопроса в следующем, для повышения отказоустойчивости необходимо запустить второй инстанс приложения, на другом сервере. Но при этом папка будет все та же. Соответственно легко попадаем на ситуацию, когда приложение запущенное на разных узлах кластера начнут борьбу за эксклюзивное владение каким нибудь одним и тем же файлом, и соответственно посыпятся ошибки чтения и т.п.

Вопрос? Какие есть варианты взаимной работы с одной папкой, как проще построить взаимную синхронизацию двух приложений так, чтобы они, в момент когда пытаются обращаться к документу, проверяли, не проводятся ли работы с этим документом уже в другом контуре.

Вопрос больше в концептуальном подходе, без реализации
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
В данном случае проще всего будет просто связать оба инстанса друг с другом и использовать второй инстас как резервный. Например через банальную проверку друг друга по сети запросом каким-нибудь. Один инстанс работает, а другой проверяет, что первый инстанс работает верно. Если первый инстанс не отвечает, висит, сломался и т.п. - в работу включается второй и где-нибудь ставит флаг/файл/что угодно и как, что теперь он основной, а первый - резервный будет, когда заработает и отправляет сообщение ответственному.

Чуть более сложный вариант: использовать, например, редис для хранения состояния процесса работы и через него синхронизировать инстансы. Например: первый сервис определил для себя задачу и сообщает об этом второму, что он взял такую-то задачу или такие-то файлы. Соответственно второй сервис эти файлы не трогает. Или, оба инстанса смотрят в каталог, как только что-то обнаруживают - помещают в очередь задач. А при появлении задачи в очереди - оба сервер генерируют случайно число и так выбирают кто из них возьмет следующую задачу из очереди. Т.о. можно, этих инстансов наплодить сколько угодно.

Более правильный вариант: разделить функционально вашу задачу на несколько более простых. А именно: вместо проверки каталога, запустить на том сервере, где находится данный каталог с файлами сервис наблюдения ФС, который использует системные уведомления об изменениях файловой системы. И при наступлении нужных событий - отправляет запрос в очередь на обработку, например в тот же редис, а оттуда запрос забирает один из инстансов и обрабатывает его.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mindtester
@mindtester
http://iczin.su/hexagram_48
нет проблемы работать с одной папкой..
а вот с одним файлом, конкуренция очень возможна..
один из выходов - БД, но коллизии возможны и там, хотя можно сильно сузить конкурентный диапазон..
к примеру до одной записи..

ps в любом случае, ваш носитель вне кластера (хотя иногда и сам может представлять из себя кластер ))) .. но для вашего кластерного приложения, он категорически должен выглядеть как единичное логическое устройство

pps это общепринятый подход, обеспечить непротиворечивость данных. очень теоретически, можно сфантазировать механизм синхронизации папок, из двух разных кубиков... на мой взгляд это безнадега
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы