Через несколько месяцев мне придется горизонтально разбивать мое приложение. В моем приложении есть определенные службы, которые нуждаются в загрузках процессора и памяти, а для масштабируемости я собираюсь обмануть его на нескольких 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, способный принимать идентификатор учетной записи и сопоставляя ее с одним из приложений учетной записи. Если бы я хотел получить хитрость, возможно, я мог бы реализовать фасад «Локальный», который выглядел прозрачно, предполагая, что аргументы методов могут определять, какой сервер использовать ...
Этот подход работает? Есть ли лучшие альтернативы?