запускающую большое количество неких задач (ну, типа крона). Сами задачи - в БД.
В случае единственного демона - всё достаточно просто. Держу все таски в памяти и периодически их запускаю, проверяю, играю в преферанс с поэтессами.
Но если вдруг хочется иметь 2-3 таких запущеных демона в целях отказоустойчивости - всё резко становится хуже - в том смысле, что они как-то между собой должны согласоваться: не запускать задачи дважды, и не оставлять нужные задачи незапущеными. Никто подобное не делал? Как лучше между подобными штуками синкать стейт? Приходят в голову только костыли (от "пинговать" друг друга и обмениваться "обслуживаемыми" тасками до "пинговать друг друга и держать активным только один инстанс, остальные - стендбай")
и тут мы плавно подходим к способу реализации мьютексов через бд
Я бы забил и просто сделал бы забирание демонами задач себе из какой-нибудь нормальной БД, в духе update ... set running = 1, current_daemon = (id), ... where running = 0 and ... limit 1; select ... where current_daemon = (id). И совсем не думал бы о мьютексах. Наверняка можно сделать лучше, но я бы делал так и не думал
Обсуждают сегодня