Proses latar belakang di Node.js

97

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?

Ole Spaarmann
sumber
4
Pertanyaannya adalah rekomendasi perangkat lunak seperti yang diutarakan sekarang, yang akhirnya akan ditutup. Jika Anda mengganti kalimat terakhir dengan "Apa yang setara dengan NodeJS dari API ini?" itu menjadi lebih sesuai topik. Saya ingin melihat ini dijawab daripada ditutup, karena saya perlu melakukan sesuatu yang serupa.
ssube
Terima kasih, ulangi kalimatnya.
Ole Spaarmann
2
Saran bagus di bawah. Ada juga ChildProcessAPI yang mungkin berguna. nodejs.org/api/child_process.html
lispHK01
stackoverflow.com/users/69349/ole-spaarmann - Saya akan tertarik mengetahui apa yang akhirnya Anda pilih dan jika Anda dapat memberikan contoh yang sangat sederhana tentang bagaimana Anda mengintegrasikan keputusan Anda dengan NodeJS - terima kasih!
MLissCetrus
@MLissCetrus Saya memilih untuk belajar Elixir dan tidak menggunakan NodeJS lagi :)
Ole Spaarmann

Jawaban:

115

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.

Yuri Zarubin
sumber
3
Ini adalah jawaban yang sangat bagus, tetapi menyebutkan API ChildProcess dan modul webworker-threads bisa membuatnya hebat. ;)
ssube
@ssube Saya tidak setuju dengan Anda. Kecuali jika Anda bermaksud membuat garpu yang melihat antrian untuk menjalankan beberapa perintah, Anda benar. +1 dari saya. Child_process adalah apa yang saya gunakan dan masalah saya adalah saya dapat membuka serangkaian proses yang sangat besar, tetapi jika saya memiliki cara untuk mengelola tugas yang akan dijalankan dalam antrian, maka saya akan senang bahwa CP adalah solusi yang baik. Hal ini dapat dilakukan, tetapi intinya adalah tidak melakukan semua pekerjaan sendiri, tetapi menggunakan kembali kode yang telah diuji oleh battle (dalam hal ini sesuatu seperti Kue yang melakukan semua keajaiban yang Anda butuhkan dan memungkinkan integrasi api).
dewwwald
Apakah Bull bekerja dengan pengelompokan PM2? Atau apakah Anda perlu membuat cluster Anda sendiri secara manual, seperti yang ditunjukkan dalam dokumentasinya?
Shayan Nahrvar
31

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.

wberry
sumber
3
Benarkah satu-satunya jawaban yang menyebutkan Kelinci? Ini adalah jawaban perusahaan. +1
Augie Gardner
11

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.

sean2078
sumber
3

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.

stefkin
sumber
1

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.

Qiulang
sumber
-6

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).

new sails.cronJobs('0 01 01 * * 0', function () {
   sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");

Jika Anda membutuhkan info lebih lanjut jangan ragu untuk menghubungi saya!

Zio Mak Sò
sumber
5
Saya mencari manajer proses latar belakang untuk Node. Menurut definisi, ini harus terpisah dari aplikasi web Anda. Dan tidak masalah jika Anda menggunakan Sails, Express, Hapi atau apapun yang Anda suka.
Ole Spaarmann
Ok, Anda dapat mencoba Bull atau Webworker-Threads ... semoga berhasil dengan Node.js :)
Zio Mak Sò
Sepertinya sails.js cukup besar dan melakukan lebih dari cronJobs. Saya menemukan node-cron ( github.com/kelektiv/node-cron ) yang saya yakin adalah yang digunakan sails.js.
pbatey