Mengapa saya harus menggunakan Restify?

101

Saya memiliki persyaratan untuk membangun REST API di node.js dan mencari kerangka kerja yang lebih ringan daripada express.js yang mungkin menghindari fitur yang tidak diinginkan dan akan bertindak seperti kerangka kerja yang dibuat khusus untuk membangun REST API. Restify dari intronya direkomendasikan untuk kasus yang sama.

Membaca Mengapa menggunakan restify dan bukan express? sepertinya restify adalah pilihan yang baik.

Tapi kejutan datang saat saya menjajal keduanya dengan beban.

Saya membuat sampel REST API di Restify dan membanjirinya dengan 1000 permintaan per detik. Saya terkejut karena rute tersebut mulai tidak merespons setelah beberapa saat. Aplikasi yang sama yang dibangun di express.js menangani semuanya.

Saat ini saya menerapkan beban ke API melalui

var FnPush = setInterval(function() {           
    for(i=0;i<1000;i++) 
        SendMsg(makeMsg(i));                
}, 1000);

function SendMsg(msg) {
    var post_data = querystring.stringify(msg);
    var post_options = {
        host: target.host,
        port: target.port,
        path: target.path,
        agent: false,
        method: 'POST',
        headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': post_data.length,
                "connection": "close"
            }
    };

    var post_req = http.request(post_options, function(res) {});
    post_req.write(post_data);  
    post_req.on('error', function(e) {          
    }); 
    post_req.end();
}

Apakah hasil yang saya peroleh tampak masuk akal? Dan jika demikian, apakah ekspres lebih efisien daripada restify dalam skenario ini? Atau apakah ada kesalahan dalam cara saya mengujinya?

diperbarui sebagai tanggapan atas komentar

perilaku restify

  1. ketika diumpankan dengan beban lebih dari 1000 kebutuhan itu berhenti memproses hanya dalam 1 detik menerima sampai 1015 kebutuhan dan kemudian tidak melakukan apapun. yaitu. penghitung yang saya terapkan untuk menghitung permintaan masuk berhenti naik setelah 1015.

  2. bila diberi makan dengan beban bahkan 100 reqs. per detik diterima hingga 1015 dan tidak responsif setelah itu.

mithunsatheesh
sumber
3
Apakah Anda pernah melalui ini: blog.perfectapi.com/2012/… ? Jika Anda mencari di google, Anda akan mendengar banyak orang yang meragukan kinerjanya.
Munim
3
Ada kemungkinan restifikasi blok suatu tempat saat mengurai rute atau meminta data, dan tidak melakukannya secara efisien, yang menyebabkan lonjakan waktu respons dengan beban tinggi. Express.js ringan tetapi kaya akan fungsionalitas. Cara pembuatannya, tetap membuatnya ringan karena fungsionalitas yang tidak terpakai tidak banyak berdampak pada performa secara keseluruhan. Juga dipelihara dengan baik dan digunakan oleh perusahaan-perusahaan besar, salah satu contohnya: MySpace. Saya tidak bisa melihat kerugian menggunakan Express.js untuk REST API (saya benar-benar melakukan itu), itu sebenarnya memungkinkan Anda di masa depan untuk meningkatkan API Anda karena fungsionalitasnya ada.
moka
1
@Munim: terima kasih untuk grafiknya. tetapi laman tersebut mengatakan " catatan, bagan ini kedaluwarsa sejak masalah Pemulihan kinerja diselesaikan " .. Namun sepertinya tidak ada yang terselesaikan. !!
mithunsatheesh
1
@mithunsatheesh Saya memperhatikannya juga. Tetapi karena penulis tidak melakukan studi baru, saya mengambilnya dengan sedikit garam. Masalah di github masih membuat orang mengeluh tentang kinerja.
Munim
2
Dapatkah Anda memberikan lebih banyak (restify) kode sampel?
Adrian Heine

Jawaban:

50

Corrigendum : informasi ini sekarang salah, teruslah bergulir!

ada masalah dengan skrip yang menyebabkan pengujian Restify dilakukan pada rute yang tidak diinginkan. Ini menyebabkan koneksi tetap hidup yang menyebabkan peningkatan kinerja karena berkurangnya overhead.


Ini tahun 2015 dan saya pikir situasinya telah banyak berubah sejak saat itu. Raygun.io telah memposting tolok ukur terbaru yang membandingkan hapi, express, dan restify .

Ia mengatakan:

Kami juga mengidentifikasi bahwa Restify menjaga koneksi tetap hidup yang menghilangkan overhead pembuatan koneksi setiap kali dipanggil dari klien yang sama. Agar adil, kami juga telah menguji Restify dengan flag konfigurasi untuk menutup koneksi. Anda akan melihat penurunan throughput yang substansial dalam skenario itu karena alasan yang jelas.

Gambar benchmark dari Raygun.io

Sepertinya Restify adalah pemenang di sini untuk penerapan layanan yang lebih mudah. Apalagi jika Anda sedang membangun layanan yang menerima banyak permintaan dari klien yang sama dan ingin bergerak cepat. Anda tentu saja mendapatkan lebih banyak keuntungan daripada Node telanjang karena Anda memiliki fitur seperti dukungan DTrace.

Masum
sumber
1
posting blog yang Anda sebutkan berguna, jika penulis mengungkapkan lebih detail tentang proses pengujian yang dia ikuti. Lihat komentar di bawah postingan!
mithunsatheesh
1
Ya, itu benar, karena pembandingan sulit dilakukan dengan benar, alangkah baiknya jika penulis memposting proses dan kode. Jadi saya mengambil ini sebagai sebutir garam dan ingin berbagi dengan komunitas.
Masum
Menurut dokumen Restify, itu juga mendukung DTrace. mcavage.me/node-restify/#dtrace
Jeff Fairley
1
Juga lihat tes kinerja Raygun.io 2016
Shane Holloway
3
Harap perhatikan Adendum dalam artikel yang sama yang disebutkan sebelum mengambil kesimpulan.
Vignesh TV
26

Ini adalah 2017 dan tes kinerja terbaru oleh Raygun.io membandingkan hapi, express, restify dan Koa.

Ini menunjukkan bahwa Koa lebih cepat daripada framework lain, tetapi karena pertanyaan ini tentang express dan restify, Express lebih cepat daripada restify.

Dan itu tertulis di pos

Ini menunjukkan bahwa memang Restify lebih lambat dari yang dilaporkan dalam pengujian awal saya.

masukkan deskripsi gambar di sini

Puneet Singh
sumber
11

Menurut deskripsi Node Knockout :

restify adalah modul node.js yang dibuat untuk membuat layanan web REST di Node. restify membuat banyak masalah sulit dalam membangun layanan seperti itu, seperti pembuatan versi, penanganan kesalahan, dan negosiasi konten menjadi lebih mudah. Ini juga menyediakan probe DTrace bawaan yang Anda dapatkan secara gratis untuk mengetahui dengan cepat di mana letak masalah kinerja aplikasi Anda. Terakhir, ini menyediakan API klien yang kuat yang menangani percobaan ulang / mundur untuk Anda pada koneksi yang gagal, bersama dengan beberapa masalah lainnya.

Masalah kinerja dan bug mungkin bisa diperbaiki. Mungkin uraian itu akan menjadi motivasi yang memadai.

Eric Elliott
sumber
5

Saya mengalami masalah serupa saat membandingkan beberapa kerangka kerja di OS X melalui ab. Beberapa tumpukan mati, secara konsisten, setelah sekitar permintaan ke-1000.

Saya melewati batas secara signifikan, dan masalahnya hilang.

Anda dapat memeriksa maxfiles Anda dengan ulimit , (atau launchctl limit <OS X only) dan melihat berapa maksimumnya.

Semoga membantu.

craigwaterman
sumber
Hmm .. kedengarannya mirip dengan masalah connect.bodyParser (), di mana setiap koneksi membuka file sementara di sistem file lokal?
Eric Elliott
OS biasanya memiliki batasan yang dapat dikonfigurasi pada jumlah deskriptor file yang dapat ditangani oleh proses, utas, dan / atau OS secara bersamaan. Untuk Linux: stackoverflow.com/questions/760819/… Untuk MacOS X: stackoverflow.com/questions/7578594/…
AndreasPizsa
2

saya bingung dengan express or restify or perfectAPI. bahkan mencoba mengembangkan modul di semuanya. syarat utamanya adalah membuat RESTapi. Tapi akhirnya berakhir dengan express, menguji diri saya dengan request per second yang dibuat pada semua framework, express memberikan hasil yang lebih baik dari yang lain. Meskipun dalam beberapa kasus menegaskan kembali outshines express tetapi mengungkapkan jahitan untuk memenangkan perlombaan. Saya jempol untuk mengungkapkan. Dan ya saya juga menemukan lokomotif js, beberapa kerangka MVC dibangun di atas ekspres. Jika ada yang mencari aplikasi MVC lengkap menggunakan express dan jade, carilah lokomotif.

kushvarma
sumber