ним параллельно и независимо друг от друга трудится несколько процессов. Что-то добавляют, меняют, удаляют... На текущий момент их 3, но может станет больше. Некоторые из них будут запускаться в нескольких экземплярах.
И тут настала необходимость добавления ещё одного процесса, который должен в начале работы эксклюзивно захватить этот общий ресурс, корректно "поставить на паузу" все остальные, сделать своё грязное дело и сказать этим остальным "свободны, можете продолжать".
Всё доступно в исходных кодах, всё на SpringBoot 2.7 + Hibernate +REST + OpenFeign + Zookeeper.
Не могу придумать, как реализовать действие "сообщить всем, что нужно пока встать на паузу, дождаться пока действительно встанут, сделать что требуется и сказать "продолжайте".
Ну, допустим, что команду "хорош работать, всем перерыв" можно через БД. Но как обрести уверенность, что все остальные не просто прочитали команду, а действительно завершили текущие мероприятия и встали на паузу?
попробуй повесить на слой персистентности монитор синхронизации и поиграться с java.concurrent, че-то типо симофора мб, хз
как это поможет при наличии нескольких процессов? Семафоры, мьютексы и прочие объекты синхронизации ведь работают внутри конкретного процесса. Ну ладно, мьютекс (если берем понятие из операционной системы) можно сделать глобальным. но как это поможет... ?
ну тебе надо добиться чтобы конкретный поток мог лочить монитор для всех остальных, это собсно то о чем ты и спрашиваешь
1) это, конечно, какая-то херня и так делать не надо, не просто так в нормальной микросервисной архитектуре у каждого сервиса своя база ОТДЕЛЬНАЯ 2) если уж ты решил, что можно положить в БД команду "всем стоять", то что мешает положить в БД и ответ на эту команду "ага, мы всё прекратили"?
1) полностью согласен. Но остановка работы требуется для переноса (синхронизации) данных из новой системы в старую, а та очень нежно относится к соответствию данных. Нельзя, чтобы один процесс в новой системе что-то поменял, а другой ещё не успел, при переносе у старой системы поедет крыша. 2) Я не знаю заранее, сколько процессов подлежит остановке :( Если бы знал - то вопросов бы не было: "стопатель" кладёт в БД число Х, каждый процесс, прекращая работу, уменьшает его на 1. Как только число Х стало 0 - значит все остановились.
Ну тогда ты решаешь всратую инфраструктурную задачу с плохой инфраструктурой средствами прикладного кода - не надо так. Я бы смотрел в сторону решения, которое начнёт тормозить (или не стартовать) процессы, пока обладатель эксклюзивного доступа не сделает то, что нужно
Обсуждают сегодня