Я работаю над этим несколько дней, и я нашел несколько решений, но ни один из них не был невероятно простым или легким. Проблема в основном такова: у нас есть кластер из 10 машин, каждый из которых работает на одном и том же программном обеспечении на многопоточной платформе ESB. Я могу справиться с проблемами concurrency между потоками на одной машине довольно легко, но как насчет concurrency для одних и тех же данных на разных машинах?
По сути программное обеспечение получает запросы на подачу данных клиента из одной компании в другую через веб-службы. Тем не менее, клиент может или не может существовать еще в другой системе. Если это не так, мы создаем его с помощью метода веб-службы. Поэтому для этого требуется какой-то тест-набор, но мне нужен какой-то семафор, чтобы заблокировать другие машины от возникновения условий гонки. Раньше у меня были ситуации, когда удаленный клиент был создан дважды для одного локального клиента, что не очень желательно.
Решения, с которыми я играл концептуально:
-
Использование нашей отказоустойчивой общей файловой системы для создания файлов "блокировки", которые будут проверяться каждой машиной в зависимости от клиента
-
Использование специальной таблицы в нашей базе данных и блокировка всей таблицы для выполнения "теста и установки" для записи блокировки.
-
Использование Terracotta - программного обеспечения с открытым исходным кодом, которое помогает в масштабировании, но использует модель с концентратором и спицами.
-
Использование EHCache для синхронной репликации моих "блокировок" в памяти.
Я не могу себе представить, что я единственный человек, у которого когда-либо была такая проблема. Как вы его решили? Вы что-то готовили или у вас был любимый сторонний продукт?