Как синхронизировать общий ресурс в Java, когда приложение развернуто в нескольких экземплярах за балансировщиком нагрузки - PullRequest
2 голосов
/ 11 мая 2019

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

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

Например: - Существует файл HDFS, к которому относится JavaПриложение либо добавляет / редактирует содержимое этого файла HDFS.Когда я развертываю Java-приложение в нескольких экземплярах, как я могу убедиться, что только один запрос из Java-приложения обращается к этому файлу HDFS?

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Краткий ответ - Вы не можете сделать это, не вводя много сложностей в настройку.

Хотя технически вы можете использовать что-то вроде распределенной блокировки, доступной на Zookeeper . Я бы не стал их рекомендовать. Их трудно рассуждать в масштабе, а также с точки зрения самих операций Zookeeper.

Что касается примера, который вы опубликовали, разве не были созданы такие системы, как HBase? Смоделируйте ваши данные в формате Key -> [Multiple Columns]. Затем вы можете читать / записывать данные на HBase, и это за кадром сделает тяжелую работу по редактированию / управлению несколькими файлами для вас.

С другой стороны, если вы можете смоделировать свое изменение, которое вы хотите сделать в своем файле, как событие, вы можете построить свою систему на принципах управляемой событиями архитектуры.

Подробнее об этом можно прочитать на

1 голос
/ 11 мая 2019

Я могу рекомендовать вам использовать механизм распределенной блокировки, предоставляемый Redis. Он работает так же, как стандартная блокировка или мьютекс, но работает в контексте распределенной системы. Экземпляр приложения, создающий блокировку, блокирует доступ к ресурсу для внесения изменений, затем снимает блокировку, чтобы другие экземпляры могли получить доступ к ресурсу.

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

Вот ссылка для распределенной блокировки redis: Распределенные замки с Redis

Я полагаю, что есть и другие решения, обеспечивающие такую ​​же функцию. Redis очень легок, масштабируем и прост в интеграции.

...