Горизонтальный шардинг, Java EE & JNDI - PullRequest
1 голос
/ 20 февраля 2012

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

У меня есть EAR, который содержит службы, которые мне нужно разделить. Когда я делаю это, клиенты служб (например, пользовательский интерфейс) должны будут иметь возможность обращаться к конкретному экземпляру службы. Например, допустим, у меня есть служба с именем Account, но на самом деле у меня есть 3 экземпляра этой службы, работающих в трех разных JVM (но все в одном домене Java EE). Если у меня есть сервисный локатор, который может сопоставить идентификатор учетной записи с конкретной виртуальной машиной, как я получу доступ к EJB, которые могут обслуживать эту конкретную учетную запись?

Потенциальное решение, которое я вижу, состоит в том, чтобы использовать в своих интересах имя JNDI, которое контейнер приложений дает EJB-компонентам в отдельных приложениях. Если я разверну модуль три раза с разными именами, я могу выполнить поиск JNDI, чтобы получить к ним:

Java: глобальный / AccountServer1 / AccountFacade

Java: глобальный / AccountServer2 / AccountFacade

Java: глобальный / AccountServer3 / AccountFacade

Чтобы это работало, я никогда не мог использовать внедрение зависимостей для доступа к AccountFacade, мне пришлось бы использовать AccountLocator EJB, способный принимать AccountID и отображать его в одном из приложений Account. Если бы я хотел запутаться, я мог бы реализовать «Локальный» фасад учетной записи, который выполнял поиск прозрачно, предполагая, что аргументы методов могут определить, какой сервер использовать ...

Этот подход осуществим? Есть ли лучшие альтернативы?

1 Ответ

0 голосов
/ 01 марта 2012

Вы можете взглянуть на Hibernate Shards как на образец для вашей архитектуры или использовать инфраструктуру напрямую. Короче говоря, они скрывают шардинг за интерфейсом Session (EntityManager в случае JPA).

...