Репликация кучи JVM между двумя машинами - PullRequest
30 голосов
/ 24 июля 2011

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

Я полагаю, Терракота выполняет эту задачу, но я понятия не имею, как будет выглядеть некоторый псевдокод, описывающий его основные функции.

Я просто ищу понимание этой технологии.

Ответы [ 4 ]

11 голосов
/ 25 июля 2011

Terracotta DSO работает, манипулируя байтовым кодом ваших классов (и классов JDK и т. Д.). Инструкции о том, как и когда это сделать, являются частью файла конфигурации Terracotta.

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

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

Существует много оптимизаций, используемых для повышения эффективности вышеуказанных операций: по проводам передаются только дельты полей и в форме, намного более эффективной, чем сериализация Java, многие дельты можно связывать и отправлять партиями, блокировки фактически "проверяются «конкретному клиенту, так что если данные приложения разделены между клиентами, большинство распределенных блокировок фактически являются локальной операцией, не требующей сетевого вызова и т. д.

6 голосов
/ 24 июля 2011

Терракота действительно может справиться с этим, если вы скажете это - см. описание ее DSO - Распределенных общих объектов.

Звучит круто, но я бы предпочел что-то вроде EHcache (снова может быть поддержано Terracotta), который работает на более высоком уровне.

3 голосов
/ 24 июля 2011

Одной из новых технологий, которая каким-то образом решает эту проблему, является распределенная программная транзакционная память.Вы получаете надежные гарантии согласованности данных (т. Е. Сериализуемость в 1 копию) и мощный механизм управления параллелизмом: транзакции.

AFAIK, зрелого решения не существует, но оно многообещающе.

1 голос
/ 29 июля 2011

Я бы порекомендовал вам изучить http://www.jboss.org/infinispan и посмотреть, удовлетворит ли он ваши потребности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...