2010-01-24 4 views
2

Чтобы реализовать сервер сокета Java уровня производства, каковы потенциальные ошибки, о которых я должен знать?Java Socket Server Essentials

На данный момент у меня есть базовая структура кода, используя классы ServerSocket и Socket ядра ядра java.net. Сервер ждет клиента и создает для него новый поток.
Мне было интересно, есть ли это путь, или есть другие проблемы, которые я должен рассмотреть, прежде чем запускать код в дикой природе.

Несколько вещей, которые я думал, не с моим ограниченным знанием и опытом является:

  1. Клиент обнаружения обрыва и освобождения ресурсов клиента.
  2. Пул соединений, это необходимо или я должен придерживаться существующей конструкции.
  3. Мониторинг серверов, регистрация и восстановление ошибок и т. Д.
  4. Идите с готовыми каркасами, такими как Apache Mina .. ??

Что делает ваш опыт должен сказать? ...

ответ

2

Я думаю, что это зависит от ваших вариантов использования. Но некоторые мысли:

Готовые каркасы - это хороший способ пойти. Как вы уже узнали, здесь есть о чем подумать. Смотри ниже. Некоторые возможности (которые реализуют самые разные стратегии) ​​- это Jini (основанная на обнаружении инфраструктура ориентированных на восстановление) или системы очередей (которые предлагают отличную развязку клиента и сервера и транзакцию - JMS и/или AMQP-based)

Объединение является серьезной проблемой. Это предотвратит остановку вашего сервера перед лицом слишком большого числа клиентов. Можете ли вы использовать Java ExecutorService?

Как вы можете отслеживать этот сервер? Можете ли вы использовать JMX и JConsole? Если можно, я бы предложил, что это хороший подход первого шага.

Что произойдет, если ваш сервер выключится? У ваших клиентов будет возможность автоматически подключиться? Повторите свои непогашенные запросы? Это хорошая идея повторить запрос (т. Е. Он идемпотент)?

Что вы перевозите между клиентом и сервером? Являются ли они сериализованными классами Java? Если да, обеспечили ли вы, что простая перекомпиляция сервера не требует перекомпиляции клиентов (через serialVersionUid с). Если вы переносите строки и конвертируете в байт-массивы (общий сценарий), клиент и сервер используют одну и ту же кодировку символов? Если вы запутались в кодировках, тогда прочитайте this и (возможно) выполните одно и то же кодирование между клиентом и сервером с помощью смутного имени file.encoding.

Как и в случае с распределенными вычислениями, рассмотрите вопрос о пользователе Peter Deutsch's Fallacies of Distributed Computing.

+0

JMX и JConsole - это новые концепции для меня, может быть, мне придется вдаваться в подробности относительно тех, с чего начать, с чего начать? ExecutorService слышал об этом, но никогда не использовал его раньше, каковы были бы преимущества его использования? Выключение сервера и повторное подключение клиента? Я никогда не думал об этом, что мне делать в этом случае? Да, я буду транспортировать строки и обслуживать Flash-клиентов, поэтому я понятия не имею о кодировании. –

+1

Ah :-) Так много думать! JMX/Jconsole будет подвергать вашу внутреннюю программу (например, пулы потоков) для мониторинга. ExecutorService позволит пул потоков, поэтому вы можете отменить работу из сокетов в этот пул и ограничить количество параллельных потоков. Подумайте о том, чтобы ваши клиенты снова подключались после определения разъединения. А для кодировок см. Приведенную выше ссылку. –

+0

Подводя итоги, какие готовые рамки вы предложите, чтобы освещать большинство обсуждаемых тем выше? –

1

Я был бы склонен просто использовать существующую библиотеку, чтобы сделать все, что для вас. Возможно, 2 основными являются Apache MINA и JBoss Netty, последние (как сообщается) быстрее и не склонны вызывать ошибки в памяти. Сообщение MINA является асинхронным в очередь, которая размывается другим потоком, поэтому вполне возможно получить OoM, даже если вы будете осторожны. У них есть JIRA об этом IIRC.

В качестве альтернативы можно использовать HornetQ, который построен поверх Netty, но также предоставляет JMS-фасад в клиенте api, поэтому вы можете запустить сервер обработки сообщений inprocess, с которым вы можете взаимодействовать в соответствии с JMS. Довольно удобно.

+0

Ошибки памяти? есть ли выход из них? как мне перезапустить сервер? Посмотрите на Netty. –

+1

, возможно, был некоторый прогресс в этом, так как я в последний раз смотрел, см. Http://mina.apache.org/traffic-throttling.html, хотя не было реализовано решение, насколько я могу видеть. Как только вы OoM, тогда вы должны перезапустить jvm. – Matt

+0

Может ли клиент Flash получить доступ к службе JMS? –