Реализация клиент - приложение masterserver / slaveserver Java - PullRequest
0 голосов
/ 16 февраля 2009

У нас есть служба обработки строк (c ++, использует stdin / out для ввода / вывода), которая имеет разные макеты, каждый макет выполняется отдельно (в конечном итоге будет выполняться на отдельных машинах), каждый макет требует времени для загрузки, поэтому он должен продолжайте бежать после первого запуска.

Я должен внедрить систему с клиентом, которая попросит главный сервер подключить его к соответствующему подчиненному серверу, который фактически запускает соответствующую службу макета. Подчиненный сервер будет передавать данные, переданные от клиента в службу, и по завершении станет доступным на главном сервере для других клиентов.

Вопрос в том, как лучше внедрить серверы? Должен ли я сохранять открытое соединение между ведомым / ведущим до завершения процесса, чтобы уведомить ведущее устройство о том, что соединение установлено, или сохранить какую-то переменную в синхронизированной функции, чтобы проверить это?

Любые другие важные материалы (или другие конструкции), которые я пропустил, также очень приветствуются, спасибо!

Ответы [ 2 ]

0 голосов
/ 16 февраля 2009

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

0 голосов
/ 16 февраля 2009

Предполагая, что вы не можете заменить материал на C ++, вот как я бы это сделал на макушке.

Я бы настроил один главный сервер. Этот сервер будет запускать процесс, который принимает запросы (возможно, по HTTP, так что это будет веб-служба), и я должен будет прочитать запрос, разобрать, что это такое, и затем вызвать правильное ведомое устройство. В основном это действует как прокси. Как только он получает ответ от подчиненного устройства, он пересылает его обратно вызывающей стороне. Простота здесь означает, что если вы начнете получать больше запросов одного типа, вы можете настроить для них дополнительные серверы и циклические запросы.

Подчиненными будут веб-сервисы, которые открывают программу C ++ и пересылают ввод и получают вывод. Это все, что нужно сделать.

Я не буду беспокоиться о сохранении открытых соединений (кроме как между ведомым устройством и программой C ++ на основе вашего описания). Простое использование веб-запроса для этого материала сохранит связь между ведущим и ведомым устройством открытым во время процесса, но это не должно быть проблемой. Таким образом, вам не нужно беспокоиться об этой детали.

Теперь, будь я на вашем месте, я бы серьезно задумался о том, чтобы переопределить код C ++ в Java или вызвать его через JNI или что-то в этом роде. Если вы можете избежать этого, я думаю, что избегание Java-оболочки вокруг C ++ было бы хорошей целью при разработке. Java может выполнить любой дорогостоящий процесс во время запуска один раз, а затем хранить все в памяти, как это делает код C ++.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...