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