Pendekatan apa yang baik untuk menangani proses latar belakang dalam aplikasi NodeJS?
Skenario : Setelah pengguna memposting sesuatu ke aplikasi, saya ingin mengolah data, meminta data tambahan dari sumber daya eksternal, dll. Semua ini cukup memakan waktu, jadi saya ingin keluar dari loop req / res. Idealnya adalah hanya memiliki antrian pekerjaan di mana Anda dapat dengan cepat membuang pekerjaan dan daemon atau pelari tugas akan selalu mengambil yang tertua dan memprosesnya.
Di RoR saya akan melakukannya dengan sesuatu seperti Delayed Job. Apa Node yang setara dengan API ini?
javascript
node.js
background-process
task-queue
Ole Spaarmann
sumber
sumber
ChildProcess
API yang mungkin berguna. nodejs.org/api/child_process.htmlJawaban:
Jika Anda menginginkan sesuatu yang ringan, yang berjalan dalam proses yang sama dengan server, saya sangat merekomendasikan Bull . Ini memiliki API sederhana yang memungkinkan kontrol yang sangat baik atas antrian Anda.
Jika Anda mencari sesuatu yang berjalan sebagai proses pekerja mandiri, mungkin lihat Kue . Ini dapat berjalan sebagai server API RESTful, dan bahkan memiliki beberapa aplikasi front-end yang ditulis untuknya.
Jika Anda sudah familiar dengan Ruby Resque, ada implementasi node yang disebut Node-resque
Bull, Kue, dan Node-resque semuanya didukung oleh Redis , yang ada di mana-mana di antara antrean pekerja Node.js. Ketiganya akan dapat melakukan apa yang dilakukan RoR's DelayedJob, itu masalah fitur spesifik yang Anda inginkan, dan preferensi API Anda.
sumber
Pekerjaan latar belakang tidak terkait langsung dengan pekerjaan layanan web Anda, jadi tidak boleh dalam proses yang sama. Saat Anda meningkatkan skala, penggunaan memori dari pekerjaan latar belakang akan memengaruhi kinerja layanan web. Tapi Anda bisa meletakkannya di repositori kode yang sama jika Anda mau, apa pun yang lebih masuk akal.
Satu pilihan yang baik untuk pengiriman pesan antara dua proses adalah redis , jika menjatuhkan pesan sesekali tidak masalah. Jika Anda ingin "tidak ada pesan yang tertinggal", Anda memerlukan pialang kelas berat seperti Rabbit . Proses layanan web Anda dapat menerbitkan dan proses pekerjaan latar belakang Anda dapat berlangganan.
Kedua proses tidak perlu dihosting bersama, keduanya dapat berada di VM terpisah, container Docker, apa pun yang Anda gunakan. Ini memungkinkan Anda untuk keluar tanpa banyak masalah.
sumber
Jika Anda menggunakan MongoDB, saya merekomendasikan Agenda . Dengan begitu, instance Redis yang terpisah tidak berjalan dan fitur seperti penjadwalan, antrian, dan UI Web semuanya ada. Agenda UI bersifat opsional dan tentunya dapat dijalankan secara terpisah.
Juga merekomendasikan untuk menyiapkan abstraksi yang digabungkan secara longgar antara logika aplikasi Anda dan sistem antrian / penjadwalan sehingga seluruh sistem pemrosesan latar belakang dapat ditukar jika diperlukan. Dengan kata lain, jauhkan sebanyak mungkin logika aplikasi / pemrosesan dari definisi tugas Agenda Anda agar tetap ringan.
sumber
Saya ingin menyarankan penggunaan Redis untuk menjadwalkan pekerjaan. Ini memiliki banyak struktur data yang berbeda, Anda selalu dapat memilih salah satu yang lebih sesuai dengan kasus penggunaan Anda.
Anda menyebutkan RoR dan DJ, jadi saya anggap Anda sudah familiar dengan sidekiq. Anda dapat menggunakan node-sidekiq untuk penjadwalan pekerjaan jika Anda mau, tetapi imonya kurang optimal, karena tujuan utamanya adalah untuk mengintegrasikan nodejs dengan RoR.
Untuk daemonising pekerja, saya sarankan menggunakan PM2 . Ini banyak digunakan dan dipelihara secara aktif. Ini memecahkan banyak masalah (misalnya penerapan, pemantauan, pengelompokan) jadi pastikan itu tidak akan berlebihan untuk Anda.
sumber
Saya mencoba antrian lebah & banteng dan memilih banteng pada akhirnya. Saya pertama kali memilih bee-queue b / c itu cukup sederhana, contohnya mudah dipahami, sedangkan contoh banteng agak rumit. wiki lebah Bee Antrian Origin juga bergema dengan saya. Tetapi masalah dengan lebah <1> waktu penyelesaian masalah mereka cukup lambat, pembaruan terbaru mereka adalah 10 bulan yang lalu. <2> Saya tidak dapat menemukan cara mudah untuk menjeda / membatalkan pekerjaan.
Bull, di sisi lain, sering memperbarui kode mereka, menanggapi masalah. Evaluasi antrian pekerjaan Node.js mengatakan kelemahan bull adalah "waktu penyelesaian masalah yang lambat", tetapi pengalaman saya sebaliknya!
Tapi bagaimanapun juga api mereka mirip sehingga cukup mudah untuk beralih dari satu ke yang lain.
sumber
Saya menyarankan untuk menggunakan kerangka kerja Node.js yang tepat untuk membangun aplikasi Anda.
Menurut saya yang paling kuat dan mudah digunakan adalah Sails.js .
Ini adalah kerangka kerja MVC jadi jika Anda terbiasa mengembangkan dalam ROR, Anda akan merasa sangat mudah!
Jika Anda menggunakannya, Ini sudah menghadirkan manajer pekerjaan yang kuat (dalam istilah javascript).
Jika Anda membutuhkan info lebih lanjut jangan ragu untuk menghubungi saya!
sumber