Saya perlahan belajar node.js
dan memiliki proyek kecil yang ingin saya mulai. Proyek ini akan memiliki banyak proses latar belakang (mengunduh data dari situs eksternal, mem-parsing file CSV, dll.).
"Kemenangan" besar bagi saya dan simpul adalah fakta menggunakan JavaScript untuk klien dan server. Saya kode di Jawa dan JavaScript dalam pekerjaan saya, tetapi saya juga cukup baik di Ruby.
Tapi, seperti yang saya katakan, tampaknya menarik untuk menggunakan satu bahasa di mana-mana dan JS sepertinya cocok dengan tagihan itu.
Namun, saya belum memiliki banyak pengalaman dalam menggunakan JS untuk menjalankan pekerjaan latar belakang. Ruby tampaknya unggul dalam hal ini. Dan saya tidak menentang menggunakannya. Jadi apa pendapat Anda tentang pergi 100% JS untuk ini? Saya menyadari proyek yang sangat besar membutuhkan solusi khusus. Saya hanya ingin tahu apakah itu sepadan dengan usaha. Atau, haruskah saya tetap dengan Ruby pada tugas-tugas semacam itu?
Pendapat dihargai.
Terima kasih
sumber
Jawaban:
Ini sangat kuat dalam menangani satu ton file I / O dan saya berharap untuk menangani satu ton komunikasi jaringan dengan baik juga. Tampaknya sangat populer untuk aplikasi berbasis soket. Hal penting yang perlu diingat adalah bahwa jika kebutuhan Anda tidak terpenuhi oleh perpustakaan yang ada (ada banyak) Anda mungkin perlu menyelam ke beberapa C yang dapat terikat dengan perintah JS. Anda juga dapat menelurkan proses Node tambahan tetapi saya curiga melakukan banyak hal yang dapat dikenakan pajak (saya berasumsi - mungkin salah - ada contoh V8 yang dihasilkan untuk masing-masing).
JS adalah single-threaded dan blocking, artinya tidak ada yang bisa dieksekusi sampai pemanggilan fungsi selesai. Ini adalah fitur yang diinginkan dari JS, pada dasarnya menghilangkan semua masalah threading dan antrian dari tangan Anda. JS tidak menghentikan hal-hal C / C ++ dari berjalan dengan cara yang lebih multi-threaded di bawah kap sehingga peran JS benar-benar lebih arsitektur / messenger. Jika Anda memproses gambar, Anda tidak akan ingin mengatasinya dengan perintah JavaScript yang sinkron karena semua hal lain di aplikasi atau server Anda akan diblokir sampai selesai. Idenya adalah bahwa Anda meminta gambar untuk diproses oleh fungsionalitas C / C ++ terikat, dan kemudian menanggapi peristiwa 'selesai' ketika gambar selesai diproses.
Ini mensyaratkan bahwa JS dalam aplikasi Node.js apa pun harus banyak didorong oleh event dan callback atau kemungkinan kinerjanya sangat buruk. Jadi Anda tidak akan melihat banyak pemanggilan metode di Node yang tidak mendapatkan fungsi untuk digunakan nanti. Satu hal yang menjadi sangat jelas di Node adalah Anda berada dalam dunia yang jelek jika Anda tidak menemukan cara untuk menangani piramida callback. misalnya
Untungnya ada banyak alat dan contoh di luar sana untuk menangani ini dengan lebih baik. Sebagian besar cenderung berputar di sekitar mekanisme janji dan hanya merantai serangkaian fungsi yang dimaksudkan untuk menanggapi masing-masing negara panggilan balik dalam array yang melakukan hal-hal piramida jelek untuk Anda di bawah tenda.
Secara pribadi, saya sangat suka mendapatkan JS di level tinggi dan C / C ++ lebih dekat ke chrome. Ini adalah kombo utama dan itu mengilhami saya untuk mulai belajar C. Dan jangan biarkan kurangnya potensi perpustakaan membuat Anda takut sampai Anda melakukan penelitian. Perpustakaan node sedang diproduksi dengan kecepatan yang sangat cepat dan jatuh tempo dengan sangat cepat. Jika Anda tidak melakukan sesuatu, peluang yang sangat tidak biasa adalah baik.
Perbedaan terbesar dari Rails, adalah bahwa JS tidak pernah berada di rails seperti sebelumnya. Kami cenderung kode untuk dapat memilikinya tetapi Anda ingin sangat cepat sehingga ada tali untuk menggantung diri dengan faktor dan arsitektur telah cukup DIY di JS sampai beberapa tahun terakhir. Saya menyebutnya kebebasan, tetapi saya menyadari itu tidak terlihat ideal bagi banyak devs.
Juga, Anda tidak akan pernah memiliki masalah "permata" di Node.js karena Anda mencoba menginstal pada sesuatu selain Mac. Pengembang web sisi klien membenci masalah ketergantungan dan dari situlah banyak inti Node berasal. Jika itu tidak berhasil di luar kotak dalam 5 menit atau kurang di setiap platform populer, kami biasanya meremasnya dan melemparkannya. Saya belum menemukan modul populer yang mengharuskan saya melakukan sesuatu yang istimewa untuk membuatnya bekerja. Sistem paket, sangat baik.
Tetapi untuk menjawab pertanyaan inti Anda secara lebih eksplisit / ringkas: Apakah baik dengan proses latar belakang?
Ya, Node pada dasarnya IS proses latar belakang dengan sarana mengemudi aplikasi melalui acara dan panggilan balik.
sumber
Satu masalah yang harus diperhatikan adalah apa yang terjadi ketika memproses file besar dalam lingkungan asinkron : jika aliran input Anda (file) lebih cepat dari aliran output Anda (db) maka Anda tidak akan dapat menangani peristiwa input data dengan cepat cukup. Ini akan membanjiri sebagian sistem Anda (aliran output atau memori) atau menyebabkan Anda kehilangan data. Untuk alasan ini, pemrosesan data secara asinkron bisa sedikit rumit. Tetapi seperti yang saya jelaskan pada artikel yang ditautkan, kemampuan untuk menjeda aliran input memungkinkan untuk mencekik dengan cara yang sesuai dengan situasi Anda.
sumber
Node.js unggul di IO. Anda sangat tidak mungkin menemukan suatu hari bahwa proses Anda macet karena sebagian besar utas Anda diblokir dalam panggilan SQL.
Namun node.js benar-benar buruk pada pekerjaan yang terikat dengan komputasi. Ketika saya mendengar "banyak IO" saya pikir "yeah! Go node!", Tetapi ketika saya mendengar "parsing," saya sedikit ragu. Saya tidak yakin apakah ini untuk alasan apa pun selain orang-orang yang tidak multithreading node dengan benar, tetapi sejauh ini semua pekerjaan komputasi-terikat produk saya terjadi di luar node.
Multithreading di node.js sulit diatur dengan benar. Semuanya single threaded secara default dan sebagian besar kode ditulis dengan asumsi bahwa itu hanya akan berjalan di bawah satu utas. Anda tentu perlu menggunakan domain untuk mencegah kesalahan pada satu utas dari menjatuhkan seluruh aplikasi Anda.
Perhatikan juga bahwa node mungkin sedikit lebih lemah dalam beberapa kemampuan perusahaan. Misalnya, pustaka loggingnya tidak bisa dibandingkan dengan Java. Saat ini tidak ada kerangka logging yang baik yang bahkan mendukung dan MDC, yang dalam praktiknya berarti Anda harus melakukan banyak
var logPrefix = userId + ": "
hal.Saya juga tidak pernah menjalankan repo npm pribadi, Anda mungkin memerlukannya tergantung pada apakah kode Anda berpemilik.
sumber
Jika proses latar belakang Anda dapat berjalan berurutan, itu bisa sangat bagus. Pada posisi terakhir saya, saya harus menulis sejumlah praprosesor, ekspor, dan utilitas terjemahan untuk banyak sumber data. Menggunakan NodeJS sangat mudah di sini.
Jika Anda tidak melakukan banyak pemrosesan terikat komputasi, manipulasi string pendek yang sederhana, dan penguraian integer tidak terlalu buruk, jika Anda perlu memanipulasi gambar, itu mungkin bukan alat terbaik (meskipun ada pembungkus dan modul yang dapat dipanggil) itu bisa bekerja dengan baik).
Saran, pertahankan modul yang menggunakan stream. Ini dapat membuatnya lebih mudah untuk menyalurkan pemrosesan Anda ke modul untuk langkah tertentu. Jika Anda melihat bagaimana event-stream digunakan dalam gulp-jade untuk alat build tegukan misalnya, Anda dapat melihat seberapa mampunya.
Untuk CSV, Anda dapat menggunakan node-csv , yang cukup bagus untuk membangun basis untuk pemipaan catatan ke aliran prosesor.
Untuk XML ish besar, di mana Anda ingin melakukan satu rekaman pada suatu waktu, saya akan melihat node-halfstreamxml yang membaca aliran XML Anda menggunakan prosesor SAX, dan meningkatkan peristiwa untuk setiap node. Saya akan membungkusnya menjadi aliran baca / tulis sehingga Anda dapat meningkatkan kecocokan yang diinginkan. Banyak parser objek xml dalam simpul akan berusaha membaca / mem-parsing seluruh xml sekaligus, dan untuk mengatakan 100mb xml yang menjadi besar ... di mana halfstreamxml akan membaca sebagai aliran.
CATATAN: ada prosesor lain seperti xml-stream yang akan menggunakan expat (C library) di bawahnya, yang dapat memberikan lebih banyak kinerja, tetapi lebih mudah dibawa-bawa tanpa lingkungan build.
Secara umum, sudah menjadi sukacita nyata untuk menggunakan ...
sumber