Node.js'de arka plan işlemleri


101

Bir NodeJS uygulamasında arka plan işlemlerini ele almak için iyi bir yaklaşım nedir?

Senaryo : Bir kullanıcı bir uygulamaya bir şey gönderdikten sonra, verileri sıkıştırmak, harici kaynaklardan ek veriler talep etmek, vb. İstiyorum. Bütün bunlar oldukça zaman alıyor, bu yüzden req / res döngüsünden çıkmasını istiyorum. İdeal olan, bir işi hızlı bir şekilde bırakabileceğiniz ve bir arka plan programı veya görev çalıştırıcısının her zaman en eskisini alıp işleyeceği bir iş kuyruğuna sahip olmaktır.

RoR'da bunu Gecikmeli İş gibi bir şeyle yapardım. Bu API'nin Düğüm eşdeğeri nedir?


4
Soru, şimdi ifade edildiği şekliyle bir yazılım tavsiyesidir ve kapanacak. Son cümleyi "Bu API'nin NodeJS eşdeğeri nedir?" İle değiştirirseniz daha çok konuyla ilgili hale gelir. Benzer bir şey yapmam gerektiğinden, bunun kapalı olmaktan çok yanıtlandığını görmek isterim.
ssube

Teşekkürler, yeniden yazdım.
Ole Spaarmann

2
Aşağıda iyi öneriler. Ayrıca ChildProcessyararlı olabilecek API var. nodejs.org/api/child_process.html
lispHK01

stackoverflow.com/users/69349/ole-spaarmann - Sonunda neyi seçtiğinizi bilmek isterdim ve kararınızı NodeJS ile nasıl entegre ettiğinize dair çok basit bir örnek verebilirseniz - teşekkürler!
MLissCetrus

1
@MLissCetrus Elixir öğrenmeyi ve artık NodeJS kullanmamayı seçtim :)
Ole

Yanıtlar:


114

Sunucuyla aynı süreçte çalışan hafif bir şey istiyorsanız, Bull'u şiddetle tavsiye ederim . Sıralarınız üzerinde ayrıntılı bir kontrol sağlayan basit bir API'ye sahiptir.

Bağımsız bir işçi süreci olarak çalışan bir şey arıyorsanız, belki Kue'ye bakın . RESTful API sunucusu olarak çalışabilir ve hatta bunun için yazılmış birkaç ön uç uygulaması vardır.

Ruby'nin Resque'e aşina iseniz, Node-resque adlı bir düğüm uygulaması vardır.

Bull, Kue ve Node-resque'in tümü , Node.js işçi kuyrukları arasında her yerde bulunan Redis tarafından desteklenmektedir . Her 3 kişi de RoR'un DelayedJob'unun yaptığını yapabilir, bu istediğiniz belirli özellikler ve API tercihlerinizle ilgilidir.


3
Bu çok iyi bir cevap, ancak ChildProcess API ve webworker-thread modülünden bahsetmek onu harika hale getirebilir. ;)
ssube

@ssube Sana katılmıyorum. Bazı komutları çalıştırmak için kuyruğa bakan bir çatal oluşturmak istemediğiniz sürece haklısınız. Benden +1. Child_process benim kullandığım şey ve benim sorunum, çok büyük bir süreç kümesi açabilmem, ancak bir kuyrukta çalıştırılacak görevleri yönetmenin bir yolu olsaydı, CP'nin iyi bir çözüm olmasından mutlu olurdum. Bu yapılabilir, ancak asıl mesele tüm işi kendiniz yapmak değil, savaşta test edilen kodu yeniden kullanmaktır (bu durumda ihtiyacınız olan tüm sihri yapan ve api entegrasyonlarına izin veren Kue gibi bir şey).
dewwwald

Bull, PM2 kümeleme ile çalışır mı? Veya belgelerinde gösterildiği gibi kendi kümelerinizi manuel olarak oluşturmanız mı gerekiyor?
Shayan Nahrvar

33

Arka plan işleri doğrudan web hizmeti çalışmanızla ilgili değildir, bu nedenle aynı süreçte olmamaları gerekir. Siz ölçeklendirdiğinizde, arka plan işlerinin bellek kullanımı web hizmeti performansını etkileyecektir. Ama isterseniz onları aynı kod havuzuna koyabilirsiniz, daha mantıklı olan ne ise.

Arada sırada bir mesaj bırakmanız uygunsa , iki işlem arasında mesajlaşmak için iyi bir seçim, yeniden gönderme olacaktır . "Geride mesaj kalmadı" istiyorsanız, Rabbit gibi daha ağır bir komisyoncuya ihtiyacınız olacak . Web hizmeti süreciniz yayınlayabilir ve arka plan iş süreciniz abone olabilir.

İki işlemin birlikte barındırılması gerekli değildir, bunlar ayrı VM'lerde, Docker konteynerlerinde, ne kullanırsanız kullanın. Bu, çok fazla sorun yaşamadan ölçeklendirmenize olanak tanır.


5
Gerçekten Tavşan'dan bahseden tek cevap? Bu kurumsal cevaptır. +1
Augie Gardner

@wberry Nodejs çalışan konuları dikkate alındığında cevabınız değişir mi?
Brendan

Node ile birkaç yıldır çalışmıyorum. Ancak bu yeni iş parçacığı sistemi, dilin orijinal amacına aykırı görünüyor. İçgüdülerim, bu modülü kullanmaktan kaçınmaktır, bunun kastedildiği dar durumlar haricinde - setImmediateçağrılarla gerçekleştirilmesi zor olan CPU yoğun hesaplamalar .
wberry

Aynı süreçte temizlik ve işlem kodunu birleştirmenin ana endişeleri bellek ve G / Ç'dir. Temizlik kodu bir domuza dönüşürse trafiği etkileyebilir. İşçi paketini kullanmak bir komisyoncu ihtiyacını ortadan kaldırır, ancak sizi bu risklere maruz bırakır.
wberry

11

Eğer MongoDB kullanıyorsanız, tavsiyem Gündem . Bu şekilde, ayrı Redis örnekleri çalışmaz ve planlama, kuyruğa alma ve Web Kullanıcı Arayüzü gibi özelliklerin tümü mevcuttur. Gündem kullanıcı arayüzü isteğe bağlıdır ve elbette ayrı olarak çalıştırılabilir.

Ayrıca, uygulama mantığınız ile kuyruklama / zamanlama sistemi arasında gevşek bir şekilde bağlı bir soyutlama oluşturmanızı tavsiye ederim, böylece gerekirse tüm arka plan işleme sistemi değiştirilebilir. Diğer bir deyişle, hafifletmek için uygulama / işleme mantığını Gündem iş tanımlarınızdan uzak tutun.


3

İşleri planlamak için Redis'i kullanmanızı öneririm . Çok sayıda farklı veri yapısına sahiptir, her zaman kullanım durumunuza daha uygun olanı seçebilirsiniz.

RoR ve DJ'den bahsettiniz, bu yüzden sidekiq'e aşina olduğunuzu varsayıyorum. İsterseniz iş planlaması için node-sidekiq'i kullanabilirsiniz , ancak asıl amacı nodej'leri RoR ile entegre etmek olduğu için suboptimal imo'dur.

Çalışanların daemonising'i için PM2 kullanmanızı tavsiye ederim . Yaygın olarak kullanılır ve aktif olarak korunur. Pek çok sorunu çözer (örn. Dağıtım, izleme, kümeleme), bu nedenle sizin için aşırı bir şey olmayacağından emin olun.


2

Arı kuyruğu ve boğayı denedim ve sonunda boğayı seçtim. İlk önce arı kuyruğunu seçtim, bu oldukça basit, örneklerinin anlaşılması kolay, boğanın örnekleri biraz karmaşık. arı wiki Arı sıranın Kökeni da benimle yankılanır. Ancak arı ile ilgili sorun <1> sorun çözme sürelerinin oldukça yavaş olması, en son güncellemeleri 10 ay önceydi. <2> İşi duraklatmanın / iptal etmenin kolay bir yolunu bulamıyorum.

Bull ise sık sık kodlarını güncelliyor, sorunlara yanıt veriyor. Node.js iş kuyruğu değerlendirmesi , boğanın zayıflığının "yavaş sorunları çözme süresi" olduğunu söyledi, ancak benim deneyimim tam tersi!

Ancak yine de API'leri benzerdir, bu nedenle birinden diğerine geçmek oldukça kolaydır.


-7

Size uygulamanızı oluşturmak için uygun bir Node.js çerçevesi kullanmanızı öneririm.

Bence en güçlü ve kullanımı kolay Sails.js .

Bu bir MVC çerçevesidir, bu nedenle ROR'da geliştirmeye alışkınsanız, bunu çok kolay bulacaksınız!

Kullanırsanız, zaten güçlü (javascript terimleriyle) bir iş yöneticisi sunar.

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

Daha fazla bilgiye ihtiyacınız olursa benimle iletişime geçmekten çekinmeyin!


6
Node için bir arka plan işlem yöneticisi arıyorum. Tanım gereği bu, web uygulamanızdan ayrı olmalıdır. Ve Sails, Express, Hapi ya da herhangi bir şey kullanmanız fark etmez.
Ole Spaarmann

Tamam, Bull veya Webworker-Threads'ı deneyebilirsiniz ... iyi şanslar whit Node.js :)
Zio Mak Sò

Görünüşe göre sails.js oldukça büyük ve cronJobs'tan çok daha fazlasını yapıyor. Bahse girdiğim node-cron ( github.com/kelektiv/node-cron ) sails.js'nin kullandığını buldum.
pbatey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.