Netty vs Apache MINA


Они оба обеспечивают примерно одинаковую функциональность. Какой из них следует выбрать для разработки высокопроизводительного TCP-сервера? Каковы плюсы и минусы?

ссылки:

Apache MINA (источник)

Нетти (источник)

7 139

7 ответов:

в то время как мина и Нетти имеют схожие амбиции, они совершенно разные на практике, и вы должны тщательно рассмотреть свой выбор. Нам повезло, что у нас было много опыта с миной и было время поиграть с Нетти. Нам особенно понравился более чистый API и гораздо лучшая документация. Производительность казалась лучше и на бумаге. Что еще более важно, мы знали, что Трастин ли будет рядом, чтобы ответить на любые наши вопросы, и он, конечно же, сделал это.

мы нашли в Нетти все проще. Период. В то время как мы пытались переопределить ту же функциональность, которую мы уже имели на MINA, мы сделали это с нуля. Следуя отличной документации и примерам, мы получили больше функциональности в гораздо меньшем количестве кода.

трубопровод Netty работал лучше для нас. Это как-то проще, чем MINAs, где все является обработчиком, и вам решать, обрабатывать ли восходящие события, нисходящие события, оба или потреблять более низкий уровень материал. Поглощение байтов в" переигрывающих " декодерах было почти удовольствием. Было также очень приятно иметь возможность перенастроить конвейер на лету так легко.

но звездная привлекательность Netty, imho, - это возможность создавать обработчики конвейеров с "покрытием одного". Вы, вероятно, читали об этой аннотации покрытия уже в документации, но по существу она дает вам состояние в одной строке кода. Без возни, без карт сеансов, синхронизации и тому подобного, мы просто смогли объявить регулярные переменные (скажем, "имя пользователя") и использовать их.

но потом мы наткнулись на блокпост. У нас уже был многопротокольный сервер под MINA, в котором наш протокол приложений работал через TCP/IP, HTTP и UDP. Когда мы перешли на Netty, мы добавили SSL и HTTPS в список в течение нескольких минут! Пока все хорошо, но когда дело дошло до UDP, мы поняли, что ошиблись. Мина была очень добра к нам в том, что мы могли рассматривать UDP как "подключенный" протокол. В Соответствии С Нетти такой абстракции не существует. UDP является протоколом без установления соединения и Нетти лечит его как таковой. Нетти раскрывает больше бесконтактной природы UDP на более низком уровне, чем мина. Есть вещи, которые вы можете сделать с UDP под Netty, чем вы не можете под абстракцией более высокого уровня, которую предоставляет MINA, но на которую мы полагались.

не так просто добавить оболочку" connected UDP " или что-то еще. Учитывая временные ограничения и по совету Trustin, что лучший способ продолжить-это реализовать наш собственный транспортный провайдер в Нетти, который не был бы быстрым, мы должны были отказаться от Нетти в конце концов.

Итак, внимательно посмотрите на различия между ними и быстро доберитесь до стадии, когда вы можете протестировать любую сложную функциональность, работающую так, как ожидалось. Если вы уверены, что Нетти выполнит эту работу, тогда я без колебаний пойду с ней по мине. Если вы переходите от MINA к Netty, то то же самое относится, но стоит отметить, что два API действительно значительно отличаются, и вы должны рассмотрим виртуальный рерайт для Нетти - вы не пожалеете!

MINA имеет больше возможностей из коробки за счет сложности и относительно низкой производительности. Некоторые из этих функций были интегрированы в ядро слишком плотно, чтобы быть удалены, даже если они не нужны пользователю. В Netty я попытался решить такие проблемы дизайна, сохраняя при этом известные сильные стороны MINA.

В настоящее время большинство функций, доступных в MINA, также доступны в Netty. На мой взгляд, Netty имеет более чистый и документированный API, поскольку Netty является результатом попытка перестроить MINA с нуля и решить известные проблемы. Если вы обнаружите, что существенная функция отсутствует, пожалуйста, не стесняйтесь размещать свои предложения на форуме. Я был бы рад ответить на вашу озабоченность.

также важно отметить, что Нетти имеет более быстрый цикл разработки. Просто проверьте дату выпуска последних релизов. Кроме того, вы должны учитывать, что команда MINA приступит к серьезной перезаписи, MINA 3, Что означает, что они нарушат совместимость API полностью.

я протестировал производительность 2 реализаций "Google Protobuffer RPC", где один был основан на Netty (netty-protobuf-rpc), а другой-на mina (protobuf-mina-rpc). Netty оказался последовательно быстрее (+- 10% ) для всех размеров сообщений - что создает резервную копию общей заявки на производительность на веб-сайте Netty. Поскольку вы хотите выжать каждый бит эффективности из своего кода при использовании такой библиотеки RPC, я закончил писать protobuf-rpc-pro на основе Нетти. Я использовал Мина в прошлом, но найти их документацию 2.0 Материал имеет большие отверстия, и нарушение обратной совместимости API большой минус.

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

на сайте Netty вы можете найти некоторую производительность отчеты. Как и ожидалось : -) они указывают Нетти как рамки с лучшей производительностью.

Я никогда не использовал Netty, но я уже использовал MINA для реализации протокола TCP. Реализация кодирования и декодирования была легкой, но реализация государственной машины была не так проста. Мина предоставляет некоторые классы, чтобы помочь вам при реализации государственной машины, но я нашел их довольно трудно использовать. В конце концов мы решил угробить мину и реализовать протокол с нуля, и на удивление мы закончили с более быстрым сервером.

Я предпочитаю Нетти.

Twitter также выбрал Netty для создания своей новой поисковой системы и ускорил ее до 3 раз быстрее.

Ref:Twitter поиск теперь в 3 раза быстрее

мы выбрали Netty по сравнению с некоторыми другими конкурентами, такими как Mina и Jetty, потому что у него есть более чистый API, лучшая документация и, что более важно, потому что несколько других проектов в Twitter используют эту структуру.

Я только когда-либо использовал MINA для создания небольшого http-сервера. Самые большие проблемы, с которыми я столкнулся с ним до сих пор:

  1. Он будет держать свой "запрос" и "ответ" в памяти. Это только проблема, потому что протокол, который я решил использовать, является http. Однако вы можете использовать свой собственный протокол, чтобы обойти это.
  2. нет возможности предоставить поток с диска в случае, если вы хотите обслуживать большие файлы. Опять же можно обойти, реализовав свой собственный протокол

хорошие вещи об этом:

  1. может обрабатывать много подключений
  2. Если вы решите реализовать какую-то распределенную рабочую систему, то знание того, когда один из ваших узлов отключается и теряет соединение, полезно для перезапуска работы на другом узле.