1. ホーム
  2. java

[解決済み] NettyとApache MINAの比較

2022-05-12 04:18:22

質問

両者はほぼ同じ機能を提供します。高性能なTCPサーバーを開発するには、どちらを選ぶべきでしょうか?また、長所と短所は何ですか?

参考リンク

アパッチミナ ( ソース )

ネッティ ( ソース )

解決方法は?

MINAとNettyは、同じような志を持っていますが、実際にはかなり異なるので、よく考えて選択する必要があります。私たちは幸運にも、MINAで多くの経験を積んだ後、Nettyで遊ぶ時間を持つことができました。NettyはAPIがすっきりしていて、ドキュメントも充実している。性能面でも優れているように思えました。さらに重要なことは、Trustin Leeがどんな質問にも答えてくれるということです。

Nettyの方がすべてが簡単だと思いました。その通りです。MINAですでに持っていたのと同じ機能を再実装しようとしたのですが、ゼロからやり直しました。優れたドキュメントとサンプルに従うことで、より多くの機能をより少ないコードで実現することができた。

Netty Pipelineは、私たちにとってより効果的でした。すべてがハンドラで、上流のイベントを処理するか、下流のイベントを処理するか、両方を処理するか、もっと低レベルのものを消費するかは、あなた次第なのです。デコーダーの再生でバイトを消費するのは、ほとんど快感でした。また、パイプラインをオンザフライで簡単に再設定できるのも非常に素晴らしいことでした。

しかし、Nettyの最大の魅力は、quot;coverage of one"でパイプラインハンドラを作成できることだと思います。このカバレッジアノテーションについては、すでにドキュメントで読んだことがあると思いますが、基本的には1行のコードでステートを提供します。セッションマップや同期といった面倒なことをせず、通常の変数(例えば "username")を宣言して使うだけでいいんです。

しかし、そこで一つの壁にぶつかりました。私たちはすでにMINAでマルチプロトコルのサーバーを持っていて、アプリケーションのプロトコルはTCP/IP、HTTP、UDPで動作していた。Nettyに乗り換えたら、SSLとHTTPSが数分でリストに追加されたのです ここまではよかったのですが、UDPになったとき、私たちは失敗したことに気がつきました。MINAは、UDPをquot;connected"プロトコルとして扱えるという点で非常に親切だった。Nettyでは、そのような抽象化はありません。UDPはコネクションレスであり、Nettyはそれをそのように扱います。Nettyは、MINAよりも低いレベルでUDPのコネクションレス性をより多く公開している。Nettyの下では、MINAが提供する高水準の抽象化ではできないが、私たちが依存していたUDPでできることがある。

UDPのラッパーを追加したりするのは、そう簡単なことではありません。時間の制約もあり、また、Trustinのアドバイスで、Nettyに独自のトランスポートプロバイダを実装するのがベストだが、それはすぐにはできないとのことで、結局Nettyは断念せざるを得なかった。

ですから、両者の違いをよく見て、トリッキーな機能が期待通りに動くかどうかをテストできる段階まで早く持っていくことです。もし、Nettyで十分だと思うのであれば、私は迷わずMINAよりNettyを選びます。MINAからNettyに移行する場合も同様ですが、2つのAPIは大きく異なるので、Netty用に仮想リライトすることを検討したほうがいいでしょう。