กระบวนการเบื้องหลังใน Node.js


101

aproach ที่ดีในการจัดการกระบวนการเบื้องหลังในแอปพลิเคชัน NodeJS คืออะไร?

สถานการณ์ : หลังจากที่ผู้ใช้โพสต์บางอย่างไปยังแอปฉันต้องการบีบอัดข้อมูลขอข้อมูลเพิ่มเติมจากแหล่งข้อมูลภายนอก ฯลฯ ทั้งหมดนี้ค่อนข้างใช้เวลานานดังนั้นฉันจึงต้องการให้มันออกจากลูป req / res วิธีที่ดีที่สุดคือมีคิวงานที่คุณสามารถถ่ายโอนงานได้อย่างรวดเร็วและ daemon หรือนักวิ่งงานจะใช้งานที่เก่าแก่ที่สุดและประมวลผลเสมอ

ใน RoR ฉันจะทำบางอย่างเช่น Delayed Job Node ที่เทียบเท่ากับ API นี้คืออะไร


4
คำถามคือคำแนะนำซอฟต์แวร์ตามที่มีการพูดคุยกันในตอนนี้ซึ่งจะถูกปิดลง หากคุณจะแทนที่ประโยคสุดท้ายด้วย "NodeJS ที่เทียบเท่ากับ API นี้คืออะไร" มันกลายเป็นหัวข้อมากขึ้น ฉันต้องการเห็นคำตอบนี้แทนที่จะปิดเนื่องจากฉันต้องทำสิ่งที่คล้ายกัน
ssube

ขอบคุณเรียบเรียงใหม่
Ole Spaarmann

2
คำแนะนำดีๆด้านล่างนี้ นอกจากนี้ยังมีChildProcessAPI ที่อาจมีประโยชน์ nodejs.org/api/child_process.html
lispHK01

stackoverflow.com/users/69349/ole-spaarmann - ฉันสนใจที่จะรู้ว่าคุณเลือกอะไรในที่สุดและถ้าคุณสามารถให้ตัวอย่างง่ายๆว่าคุณรวมการตัดสินใจของคุณเข้ากับ NodeJS ได้อย่างไร - ขอบคุณ!
MLissCetrus

1
@MLissCetrus ฉันเลือกเรียน Elixir และไม่ใช้ NodeJS อีกต่อไป :)
Ole Spaarmann

คำตอบ:


114

ถ้าคุณต้องการสิ่งที่มีน้ำหนักเบาที่วิ่งในกระบวนการเดียวกันกับเซิร์ฟเวอร์ผมขอแนะนำให้กระทิง มี API แบบง่ายที่ช่วยให้สามารถควบคุมคิวของคุณได้อย่างละเอียด

หากคุณกำลังมองหาสิ่งที่วิ่งเป็นกระบวนการทำงานแบบสแตนด์อโลนอาจจะมองเข้าไปในกือ สามารถทำงานเป็นเซิร์ฟเวอร์ RESTful API และยังมีแอปส่วนหน้าหลายตัวที่เขียนขึ้น

หากคุณคุ้นเคยกับ Ruby's Resque มีการใช้งานโหนดที่เรียกว่าNode-resque

Bull, Kue และ Node-resque ล้วนได้รับการสนับสนุนโดยRedisซึ่งแพร่หลายในคิวผู้ปฏิบัติงาน Node.js ทั้ง 3 คนจะสามารถทำสิ่งที่ DelayedJob ของ RoR ทำได้มันเป็นเรื่องของคุณสมบัติเฉพาะที่คุณต้องการและการตั้งค่า API ของคุณ


3
นี่เป็นคำตอบที่ดีมาก แต่การกล่าวถึง ChildProcess API และโมดูลwebworker-threadsอาจทำให้ดีมาก ;)
ssube

@ssube ฉันไม่เห็นด้วยกับคุณ เว้นแต่คุณจะหมายถึงการสร้างทางแยกที่ดูคิวเพื่อรันคำสั่งบางคำที่คุณคิดถูก +1 จากฉัน Child_process คือสิ่งที่ฉันใช้และปัญหาของฉันคือฉันสามารถเปิดชุดกระบวนการขนาดใหญ่ได้ แต่ถ้าฉันมีวิธีจัดการงานที่ต้องรันในคิวฉันก็ยินดีที่ CP เป็นทางออกที่ดี สิ่งนี้สามารถทำได้ แต่ประเด็นคืออย่าทำงานทั้งหมดด้วยตัวเอง แต่ให้นำโค้ดที่ผ่านการทดสอบการต่อสู้มาใช้ซ้ำ (ในกรณีนี้บางอย่างเช่น Kue ที่ทำเวทมนตร์ทั้งหมดที่คุณต้องการและอนุญาตให้รวม API)
dewwwald

Bull ทำงานร่วมกับ PM2 clustering หรือไม่ หรือคุณต้องสร้างคลัสเตอร์ของคุณเองด้วยตนเองดังที่แสดงในเอกสารประกอบ?
Shayan Nahrvar

33

งานเบื้องหลังไม่เกี่ยวข้องโดยตรงกับงานบริการบนเว็บของคุณดังนั้นจึงไม่ควรอยู่ในกระบวนการเดียวกัน เมื่อคุณขยายขนาดการใช้งานหน่วยความจำของงานเบื้องหลังจะส่งผลต่อประสิทธิภาพของบริการเว็บ แต่คุณสามารถใส่ไว้ในที่เก็บโค้ดเดียวกันได้หากต้องการสิ่งที่สมเหตุสมผลกว่า

ทางเลือกที่ดีทางหนึ่งสำหรับการส่งข้อความระหว่างสองกระบวนการคือredisหากทิ้งข้อความทุกครั้งก็โอเค ถ้าคุณต้องการ "ไม่มีข้อความทิ้งไว้ข้างหลัง" คุณจะต้องเป็นนายหน้าหนามากขึ้นเช่นกระต่าย กระบวนการบริการบนเว็บของคุณสามารถเผยแพร่และกระบวนการงานเบื้องหลังของคุณสามารถสมัครสมาชิกได้

ไม่จำเป็นสำหรับทั้งสองกระบวนการที่จะโฮสต์ร่วมกันพวกเขาสามารถอยู่บน VMs แยกต่างหากคอนเทนเนอร์ Docker สิ่งที่คุณใช้ สิ่งนี้ช่วยให้คุณขยายขนาดได้โดยไม่มีปัญหามากนัก


5
คำตอบเดียวที่กล่าวถึง Rabbit จริงๆหรือ? นี่คือคำตอบขององค์กร +1
Augie Gardner

@wberry คำตอบของคุณจะเปลี่ยนไปโดยคำนึงถึงเธรดของผู้ปฏิบัติงาน Nodejs หรือไม่?
Brendan

ฉันไม่ได้ทำงานกับ Node มาสองสามปีแล้ว แต่ระบบเธรดใหม่นี้ดูเหมือนจะสวนทางกับเจตนาเดิมของภาษา สัญชาตญาณของฉันคือหลีกเลี่ยงการใช้โมดูลนี้ยกเว้นในกรณีแคบ ๆ เหล่านั้นมีไว้สำหรับ - การประมวลผลแบบเร่งรัดของ CPU ซึ่งใช้การsetImmediateโทรได้ไม่สะดวก
wberry

ข้อกังวลหลักในการรวมการดูแลทำความสะอาดและรหัสธุรกรรมในกระบวนการเดียวกันคือหน่วยความจำและ I / O หากรหัสการทำความสะอาดกลายเป็นหมูอาจส่งผลต่อการจราจรได้ การใช้แพ็คเกจ Worker จะช่วยขจัดความต้องการของนายหน้า แต่ทำให้คุณต้องเผชิญกับความเสี่ยงเหล่านี้
wberry

11

หากคุณกำลังใช้ MongoDB ผมขอแนะนำให้วาระ ด้วยวิธีนี้อินสแตนซ์ Redis ที่แยกจากกันจะไม่ทำงานและคุณลักษณะต่างๆเช่นการตั้งเวลาการจัดคิวและ UI ของเว็บมีอยู่ทั้งหมด Agenda UIเป็นทางเลือกและสามารถรันแยกกันได้

ขอแนะนำให้ตั้งค่าสิ่งที่เป็นนามธรรมควบคู่กันอย่างหลวม ๆ ระหว่างตรรกะแอปพลิเคชันของคุณกับระบบการจัดคิว / การจัดตารางเวลาเพื่อให้สามารถสลับระบบประมวลผลพื้นหลังทั้งหมดได้หากจำเป็น กล่าวอีกนัยหนึ่งคือให้ตรรกะของแอปพลิเคชัน / การประมวลผลอยู่ห่างจากคำจำกัดความงานวาระการประชุมของคุณให้มากที่สุดเพื่อให้มีน้ำหนักเบา


3

ฉันอยากแนะนำให้ใช้Redisในการจัดตารางงาน มีโครงสร้างข้อมูลที่แตกต่างกันมากมายคุณสามารถเลือกโครงสร้างข้อมูลที่เหมาะสมกับกรณีการใช้งานของคุณได้ดีกว่า

คุณพูดถึง RoR และ DJ ดังนั้นฉันถือว่าคุณคุ้นเคยกับ sidekiq คุณสามารถใช้node-sidekiqสำหรับการจัดกำหนดการงานได้หากต้องการ แต่ imo ที่ไม่เหมาะสมเนื่องจากมีจุดประสงค์หลักเพื่อรวม nodejs เข้ากับ RoR

สำหรับผู้ปฏิบัติงาน daemonising ฉันขอแนะนำให้ใช้PM2 มีการใช้กันอย่างแพร่หลายและได้รับการดูแลอย่างสม่ำเสมอ ช่วยแก้ปัญหาได้มากมาย (เช่นการปรับใช้งานการตรวจสอบการทำคลัสเตอร์) ดังนั้นตรวจสอบให้แน่ใจว่ามันจะไม่เกินความจำเป็นสำหรับคุณ


2

ฉันลองผึ้งคิว & วัวและเลือกวัวในที่สุด ก่อนอื่นฉันเลือกผึ้งคิว b / c มันค่อนข้างง่ายตัวอย่างของพวกเขาเข้าใจง่ายในขณะที่ตัวอย่างของวัวนั้นซับซ้อนเล็กน้อย วิกิพีเดียBee Queue's Originยังสะท้อนกับฉัน แต่ปัญหาของผึ้งคือ <1> เวลาในการแก้ไขปัญหาค่อนข้างช้าอัปเดตล่าสุดเมื่อ 10 เดือนที่แล้ว <2> ฉันไม่พบวิธีง่ายๆในการหยุดชั่วคราว / ยกเลิกงาน

ในทางกลับกัน Bull มักจะอัปเดตรหัสของตนเพื่อตอบสนองต่อปัญหา การประเมินคิวงาน Node.jsกล่าวว่าจุดอ่อนของวัวคือ "แก้ปัญหาได้ช้า" แต่ประสบการณ์ของฉันตรงกันข้าม!

แต่อย่างไรก็ตาม api ของพวกเขาก็คล้ายกันดังนั้นจึงค่อนข้างง่ายที่จะเปลี่ยนจากที่หนึ่งไปยังอีก


-7

ฉันขอแนะนำให้ใช้กรอบงาน Node.js ที่เหมาะสมเพื่อสร้างแอปของคุณ

ผมคิดว่าส่วนใหญ่ที่มีประสิทธิภาพและง่ายต่อการใช้งานเป็นSails.js

เป็นเฟรมเวิร์ก MVC ดังนั้นหากคุณใช้เพื่อพัฒนาใน ROR คุณจะพบว่ามันง่ายมาก!

หากคุณใช้มันจะมีตัวจัดการงานที่มีประสิทธิภาพ (ในรูปแบบจาวาสคริปต์) อยู่แล้ว

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

หากคุณต้องการข้อมูลเพิ่มเติมโปรดอย่าลังเลที่จะติดต่อฉัน!


6
ฉันกำลังมองหาตัวจัดการกระบวนการเบื้องหลังสำหรับโหนด ตามความหมายควรแยกออกจากเว็บแอปของคุณ และไม่สำคัญว่าคุณจะใช้ Sails, Express, Hapi หรืออะไรก็ตามที่คุณต้องการ
Ole Spaarmann

ตกลงคุณสามารถลองใช้ Bull หรือ Webworker-Threads ได้ ... โชคดีเล็กน้อย Node.js :)
Zio Mak Sò

ดูเหมือนว่า Sails.js จะค่อนข้างใหญ่และทำได้มากกว่า cronJobs ฉันพบ node-cron ( github.com/kelektiv/node-cron ) ซึ่งฉันคิดว่าเป็นสิ่งที่ Sails.js ใช้
pbatey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.