воскресенье, 8 августа 2010 г.

Что такое NIO и как с ним бороться

Коротко физику природного явления NIO можно выразить формулой:

NIO = IO + select + E

Кликните в браузере поочередно на первые три переменные. Четвертая переменная, E, является энергией еквивалентной усилиям потраченным на синхронизацию между selecting thread и worker thread, а также протокол обмена в не-блокирующем режиме, в том числе учитывая дефрагментацию TCP пакетов.

Мне нужно было написать простой java server который принимает сообщения от Adobe Flash Player по протоколу XmlSocket. Задача выглядела очень простой - получай запросы и отсылай ответы, поэтому решил не прикручивать готовый application server типа томката, а написать свой маленький сервер. За день я сделал реализацию на блокирующих сокетах. Дальше решил сделать эксперимент и переписать на не-блокирующих сокетах, тоесть NIO.

Оказалось что c NIO все намного сложнее, сразу стало ясно что Е совсем не маленькая величина. Остановился на самоой простой реализации с единственным selecting thread, это заняло в два раза больше времени чем блокирующие сокеты. Последняя стадия эксперимента: безжалостно убил материализцию темной енергии Е в коде и и использовал Apache Mina. И тут я понял насколько полезна Mina для написания распределенных систем, и что нет смысла реализовывать взамодействие между частями системы на сокетах с нуля. Mina создает уровень абстракции который сводит E к минимуму. После того как прикрутил Mina, количество кода уменьшилось в три раза: было 6 классов, осталось 2.

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

Вот пример Mina сервиса на Groovy:

Комментариев нет: