Netty vs Apache MINA

144

Keduanya menyediakan fungsi yang kira-kira sama. Mana yang harus saya pilih untuk mengembangkan server TCP kinerja tinggi saya? Apa kelebihan dan kekurangannya?

Tautan referensi:

Apache MINA ( sumber )

Netty ( sumber )

GabiMe
sumber
6
Menarik juga untuk menambahkan Grizzly sebagai perbandingan.
Tandai
Grizzly adalah binatang yang sama sekali berbeda. Bahkan ada ide dukungan Grizzly untuk MINA, ketika kedua kelompok berbicara.
Hardcoded
1
@Hardcoded Anda mengatakan grizzly adalah binatang yang sama sekali berbeda, saya pendatang baru untuk ini, bisakah Anda menunjukkan perbedaan atau memberi saya artikel untuk membaca tentang itu? Saya sangat menghargainya.
arg20
1
Grizzly memiliki latar belakang yang berbeda dan terakhir kali saya melihatnya, sebagian besar cocok untuk aplikasi berbasis HTTP. Saya hanya melihat contoh-contoh dan terkejut melihat bahwa mereka menggunakan struktur yang sangat mirip dengan MINA atau Netty. Jadi binatang buas itu tidak berbeda lagi
Hardcoded

Jawaban:

211

Meskipun MINA dan Netty memiliki ambisi yang sama, mereka sangat berbeda dalam praktiknya dan Anda harus mempertimbangkan pilihan Anda dengan cermat. Kami beruntung karena kami memiliki banyak pengalaman dengan MINA dan memiliki waktu untuk bermain-main dengan Netty. Kami terutama menyukai API yang lebih bersih dan dokumentasi yang jauh lebih baik. Performanya juga tampak lebih baik di atas kertas. Lebih penting lagi, kami tahu bahwa Trustin Lee akan siap menjawab semua pertanyaan yang kami miliki, dan dia tentu saja melakukannya.

Kami menemukan segalanya lebih mudah di Netty. Titik. Sementara kami mencoba menerapkan kembali fungsi yang sama dengan yang sudah kami miliki di MINA, kami melakukannya dari awal. Dengan mengikuti dokumentasi dan contoh-contoh yang bagus kami berakhir dengan lebih banyak fungsionalitas dalam kode yang jauh lebih sedikit.

Pipa Netty bekerja lebih baik untuk kita. Entah bagaimana itu lebih sederhana daripada MINA, di mana semuanya adalah handler dan terserah Anda untuk memutuskan apakah akan menangani acara hulu, acara hilir, keduanya atau mengkonsumsi lebih banyak barang tingkat rendah. Menggigit byte dalam decoder "replaying" hampir menyenangkan. Itu juga sangat bagus untuk dapat mengkonfigurasi ulang pipa on-the-fly dengan mudah.

Tapi daya tarik bintang Netty, imho, adalah kemampuan untuk membuat penangan pipa dengan "cakupan satu". Anda mungkin telah membaca tentang penjelasan cakupan ini sudah dalam dokumentasi, tetapi pada dasarnya itu memberi Anda negara bagian dalam satu baris kode. Tanpa main-main, tidak ada peta sesi, sinkronisasi dan hal-hal seperti itu, kami hanya dapat mendeklarasikan variabel biasa (katakanlah, "nama pengguna") dan menggunakannya.

Tapi kemudian kami menabrak penghalang jalan. Kami sudah memiliki server multi-protokol di bawah MINA, di mana protokol aplikasi kami menggunakan TCP / IP, HTTP, dan UDP. Ketika kami beralih ke Netty kami menambahkan SSL dan HTTPS ke daftar dalam hitungan menit! Sejauh ini bagus, tetapi ketika sampai di UDP kami menyadari bahwa kami telah tergelincir. MINA sangat baik bagi kami karena kami dapat memperlakukan UDP sebagai protokol "terhubung". Di bawah Netty tidak ada abstraksi semacam itu. UDP tidak terhubung dan Netty memperlakukannya demikian. Netty memaparkan lebih banyak sifat tanpa koneksi UDP pada tingkat yang lebih rendah daripada MINA. Ada hal-hal yang dapat Anda lakukan dengan UDP di bawah Netty daripada yang tidak dapat Anda lakukan di bawah abstraksi tingkat tinggi yang disediakan MINA, tetapi yang menjadi sandaran kami.

Tidaklah mudah untuk menambahkan pembungkus "UDP terhubung" atau apalah. Mengingat keterbatasan waktu dan atas saran Trustin bahwa cara terbaik untuk melanjutkan adalah dengan mengimplementasikan penyedia transportasi kami sendiri di Netty, yang tidak akan cepat, kami harus meninggalkan Netty pada akhirnya.

Jadi, perhatikan perbedaan di antara mereka dan cepatlah ke tahap di mana Anda dapat menguji fungsionalitas rumit yang berfungsi seperti yang diharapkan. Jika Anda puas bahwa Netty akan melakukan pekerjaan itu, maka saya tidak akan ragu untuk melakukannya dengan MINA. Jika Anda pindah dari MINA ke Netty maka hal yang sama berlaku, tetapi perlu dicatat bahwa kedua API benar-benar berbeda secara signifikan dan Anda harus mempertimbangkan penulisan ulang virtual untuk Netty - Anda tidak akan menyesal!

Josh
sumber
3
re: komentar sebelumnya oleh Josh tentang kurangnya dukungan untuk UDP di Netty: Saya tidak mengerti mengapa Anda tidak dapat menggunakan beberapa halaman kode kerajinan tangan untuk melakukan apa yang Anda butuhkan, daripada meninggalkan Netty. UDP tetap mendengarkan pada port yang berbeda. Saya telah menguji Netty vs Nginx dan saya cukup terkesan (Netty mencetak hampir sama, atau lebih baik, di bawah beban).
137

MINA memiliki lebih banyak fitur out-of-the-box dengan biaya kompleksitas dan kinerja yang relatif buruk. Beberapa fitur diintegrasikan ke dalam inti terlalu ketat untuk dihapus bahkan jika mereka tidak diperlukan oleh pengguna. Di Netty, saya mencoba mengatasi masalah desain seperti itu sambil mempertahankan kekuatan MINA yang diketahui.

Saat ini, sebagian besar fitur yang tersedia di MINA juga tersedia di Netty. Menurut saya, Netty memiliki API yang lebih bersih dan lebih terdokumentasi karena Netty adalah hasil dari upaya membangun kembali MINA dari awal dan mengatasi masalah yang diketahui. Jika Anda menemukan bahwa fitur penting tidak ada, jangan ragu untuk mengirim saran Anda ke forum. Dengan senang hati saya akan menyampaikan kekhawatiran Anda.

Penting juga untuk dicatat bahwa Netty memiliki siklus pengembangan yang lebih cepat. Cukup, periksa tanggal rilis dari rilis terbaru. Juga, Anda harus mempertimbangkan bahwa tim MINA akan melanjutkan ke penulisan ulang besar, MINA 3, yang berarti mereka akan menghancurkan kompatibilitas API sepenuhnya.

percaya
sumber
21
Oh, @trustin adalah penulis MINA dan Netty.
Jason Heo
@trustin, saya menemukan Netty 5.0 tidak menyediakan banyak dokumen tingkat lanjut, dan materi web saat ini dengan versi lain tidak akan berfungsi. apakah Anda memiliki tautan rekomendasi untuk tutorial mina menengah dan lanjutan? terima kasih
Korben
22

Kinerja saya menguji 2 implementasi "Google Protobuffer RPC" di mana satu didasarkan pada Netty (netty-protobuf-rpc) dan yang lainnya berdasarkan mina (protobuf-mina-rpc). Netty akhirnya secara konsisten lebih cepat (+ - 10%) untuk semua ukuran pesan - yang mendukung klaim kinerja keseluruhan di situs web Netty. Karena Anda ingin memeras setiap bit efisiensi dari kode Anda ketika Anda menggunakan perpustakaan RPC, saya akhirnya menulis protobuf-rpc-pro berdasarkan Netty. Saya telah menggunakan MINA di masa lalu, tetapi menemukan dokumentasi mereka tentang barang-barang 2.0 memiliki lubang besar, dan melanggar kompatibilitas API mundur minus besar.

pjklauser
sumber
16

MINA dan Netty awalnya dirancang dan dibangun oleh penulis yang sama. Itu sebabnya mereka begitu mirip satu sama lain. MINA dirancang pada tingkat yang sedikit lebih tinggi dengan sedikit lebih banyak fitur, sementara Netty sedikit lebih cepat. Saya pikir tidak ada banyak perbedaan sama sekali, konsep dasarnya sama.

Hardcoded
sumber
9

Di situs Netty Anda dapat menemukan beberapa laporan kinerja . Seperti yang diharapkan :-) mereka menunjukkan Netty sebagai kerangka kerja dengan kinerja terbaik.

Saya tidak pernah menggunakan Netty, tetapi saya sudah menggunakan MINA untuk mengimplementasikan protokol TCP. Implementasi encoding dan decoding mudah, tetapi implementasi mesin negara tidak begitu mudah. MINA menyediakan beberapa kelas untuk membantu Anda ketika menerapkan mesin negara, tetapi saya menemukan mereka agak sulit digunakan. Pada akhirnya kami memutuskan untuk membuang MINA dan mengimplementasikan protokol dari awal, dan anehnya kami berakhir dengan server yang lebih cepat.

jassuncao
sumber
5

Saya lebih suka Netty.

Twitter juga memilih Netty untuk membangun Sistem Pencarian baru dan mempercepatnya hingga 3x lebih cepat.

Ref: Pencarian Twitter Sekarang 3x Lebih Cepat

Kami memilih Netty daripada beberapa pesaing lainnya, seperti Mina dan Jetty, karena ia memiliki API yang lebih bersih, dokumentasi yang lebih baik, dan yang lebih penting, karena beberapa proyek lain di Twitter menggunakan kerangka kerja ini.

Tho
sumber
4

Saya hanya pernah menggunakan MINA untuk membangun server kecil seperti http. Masalah terbesar yang saya temui sejauh ini:

  1. Ini akan menyimpan "permintaan" dan "respons" Anda dalam memori. Ini hanya masalah karena protokol yang saya pilih adalah http. Namun Anda dapat menggunakan protokol Anda sendiri untuk menyiasatinya.
  2. Tidak ada opsi untuk menyediakan streaming dari disk jika Anda ingin menyajikan file besar. Sekali lagi dapat diselesaikan dengan mengimplementasikan protokol Anda sendiri

Hal-hal baik tentang itu:

  1. Dapat menangani banyak koneksi
  2. Jika Anda memilih untuk menerapkan semacam sistem kerja terdistribusi maka mengetahui kapan salah satu node Anda turun dan kehilangan koneksi berguna untuk memulai kembali pekerjaan pada node lain.
Gomesla
sumber
Ketika Anda mengatakan "streaming disk untuk file besar", bukankah orang biasanya menggunakan UDP untuk itu?
djangofan
1
Tidak. Mereka menggunakan kernel sendfile (diekspos di Java sebagai FileChannel.transferTo) melalui TCP.
jbellis