2012-02-20 3 views
1

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

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

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

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

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

Java: global/AccountServer3/AccountFacade

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

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

ответ

0

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