Обзор
В этом посте, похоже, есть несколько вопросов, поэтому я постараюсь подробно рассказать вам о каждой части.
Вопрос 1 - Можно ли каким-либо образом управлять многопоточностью?
Да! Ваша реализация многопоточности может быть такой, какой вы хотите. Реализация RMI - это только взаимодействие между отдельными JVM с достаточной абстракцией, чтобы чувствовать, что они существуют в 1 JVM; таким образом, не влияет на многопоточность, поскольку это только уровень связи.
Вопрос 2. Создается ли поток для каждого удаленного вызова (на стороне сервера) или используются пулы потоков?
См. Документацию здесь . Краткий ответ, если они находятся в разных темах - нет.
Метод, передаваемый средой выполнения RMI реализации удаленного объекта, может выполняться или не выполняться в отдельном потоке. Среда выполнения RMI не дает никаких гарантий относительно отображения вызовов удаленных объектов в потоки. Поскольку удаленный вызов метода для одного и того же удаленного объекта может выполняться одновременно, реализация удаленного объекта должна убедиться, что его реализация является поточно-ориентированной.
RMI с использованием пулов потоков зависит от реализации, но как разработчик, использующий RMI , это не должно вызывать беспокойства, поскольку оно инкапсулировано в RMI уровень соединения.
Вопрос 3 - Используя RMI , как я могу гарантировать, что некоторые вызовы RMI ожидают завершения других вызовов?
Это довольно расплывчатый вопрос, но я думаю, что вы спрашиваете, как правильно блокировать синхронизацию в RMI . Это идет с вашим дизайном приложения. Давайте рассмотрим сценарий, в котором вы пытаетесь получить доступ к базе данных, и вы должны синхронизировать DB доступ. Если клиент попытается вызвать доступ через RMI , он вызовет метод удаленного сервера, который удерживает всю синхронизацию, и, таким образом, ожидает блокировки, если это необходимо. Поэтому Клиент будет ждать своей очереди для доступа к DB через сервер. Итак, в вашем текущем сценарии вы хотите, чтобы ваша синхронизация DB присутствовала на серверной стороне .
Вопрос 4 - Есть ли другой подход, не относящийся к RMI, с тем же удобством и эффективностью, который бы работал лучше для этого?
Абсолютно. Ниже приведен краткий список реализаций связи, которые можно использовать для связи.
1) RESTful
2) RMI
3) Розетки
4) gRPC
Я рекомендую использовать RESTful, поскольку он является наиболее простым и имеет множество реализаций / документации в Интернете. Эффективность, кажется, вызывает у вас серьезную озабоченность, но ваши операции манипулируют БД только стандартным образом. Поэтому я считаю, что реализация Restful обеспечит более чем достаточную эффективность.
Думайте об этом так; у вас N клиентов N, балансировщик нагрузки и M серверов. Между клиентами и серверами не существует постоянной связи, что снижает сложность и объем вычислений. По мере роста N клиентов балансировщик нагрузки создает больше экземпляров серверов и распределяет нагрузку соответствующим образом. Обратите внимание, что запросы между клиентами и серверами на самом деле довольно малы, поскольку они будут иметь полезную нагрузку и тип запроса. Кроме того, серверы будут получать запросы и вычислять операции в обычном режиме и параллельно. Оптимизация может быть выполнена на стороне сервера с помощью потоковых пулов или сред, таких как spring.