Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การเลือกตัวประมวลผลงานพื้นหลังที่เหมาะสม:อธิบายงานล่าช้าเทียบกับ Sidekiq

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

Gem หลายชนิดรองรับคิวงานและการประมวลผลเบื้องหลังในโลกของ Rails — Delayed Job และ Sidekiq เป็นสองรายการที่ได้รับความนิยมมากที่สุด

ในโพสต์นี้ เราจะมาดูรายละเอียดเกี่ยวกับงานที่ล่าช้าและ Sidekiq รวมถึงวิธีที่ทั้งสองทำงานต่อกัน

ไปกันเลย!

คำแนะนำด่วนเกี่ยวกับงานที่ล่าช้า

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

นอกจากนี้ หากคุณไม่จำเป็นต้องรักษาออบเจ็กต์งานพิเศษ (แม้ว่าจะแนะนำเป็นอย่างยิ่งสำหรับความสามารถในการทดสอบและการแยกการดำเนินการระยะยาวอย่างชัดเจน) ก็ยังช่วยให้คุณสามารถเรียก 18 บนวัตถุ Ruby ใด ๆ มันจะประมวลผลวิธีการในเบื้องหลัง

งานล่าช้า README อธิบายรูปแบบการใช้งานทั่วไปทั้งหมดได้ดี

หลายทีมเลือกงานล่าช้าเพราะว่าง่ายและใช้ฐานข้อมูลที่มีอยู่แล้ว พวกเขาไม่จำเป็นต้องใช้จ่าย/บำรุงรักษาทรัพยากรอื่นๆ

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

คำแนะนำสั้นๆ เกี่ยวกับ Sidekiq

ในทางกลับกัน Sidekiq ใช้ Redis เป็นที่เก็บข้อมูลเพื่อรักษาข้อมูลเมตาของงานทั้งหมด ซึ่งมาพร้อมกับข้อดีที่ชัดเจนของการเร็วกว่าระบบฐานข้อมูลปกติที่ Delayed Jobs ใช้มาก นอกจากนี้ แต่ละกระบวนการของ Sidekiq ยังสร้างเธรดหลายรายการเพื่อประมวลผลงานได้เร็วยิ่งขึ้นอีกด้วย

สำหรับงานพื้นหลังแต่ละงานใน Sidekiq เราจำเป็นต้องมีคลาสพิเศษที่มี 26 กังวลและตอบสนองต่อ 39 method หากต้องการต่อคิวงาน เราต้องเรียก 41 กับผู้ปฏิบัติงานที่มีการโต้แย้ง

คู่มือ 'การเริ่มต้นใช้งาน' ของ Sidekiq จะอธิบายสิ่งนี้และรูปแบบการใช้งานอื่นๆ อย่างละเอียด

การใช้งานที่ใช้งานอยู่กับงานล่าช้าหรือ Sidekiq

Rails ได้จัดเตรียมกรอบงานที่สมบูรณ์แล้วสำหรับการประกาศระดับบนสุดและการจัดการงาน ทั้งงานล่าช้าและ Sidekiq รองรับงานที่ทำงานผ่าน API แบบรวมของ ActiveJob เพียงสืบทอดมาจาก 57 และโทร 67 บนคลาสงานของคุณเพื่อจัดคิวงานไปยังแบ็กเอนด์การจัดคิวที่กำหนดค่าไว้

ข้อดีของการรันงานด้วย Active Job คือโค้ดแอปพลิเคชันของคุณกลายเป็นแบบไม่เชื่อเรื่องเฟรมเวิร์ก และการเปลี่ยนจาก Delayed Job เป็น Sidekiq (หรือกลับกัน) ก็กลายเป็นเรื่องง่าย 75 ยังทำให้การทดสอบงานที่อยู่ในคิวเป็นเรื่องง่าย

แต่สิ่งที่เป็นนามธรรมที่ได้รับจาก Active Job ยังมาพร้อมกับค่าใช้จ่ายด้านประสิทธิภาพ เนื่องจากข้อมูลงานจะต้องถูกห่อก่อนที่จะพุชไปที่ร้านค้า Sidekiq อ้างว่า ActiveJob จะช้าลงประมาณ 2-20 เท่าเมื่อพุชไปที่ Redis โดยมีค่าใช้จ่ายในการประมวลผล ~3 เท่า

งานล่าช้า กับ Sidekiq

ตอนนี้เรารู้พื้นฐานของ Delayed Jobs และ Sidekiq แล้ว เรามาเจาะลึกถึงความแตกต่างและสิ่งที่แต่ละอย่างนำมาสู่ตารางกันดีกว่า

คุณสมบัติ

สำหรับแอปพลิเคชันพื้นฐาน ทั้ง Sidekiq และ Delayed Job ต่างก็มีชุดคุณสมบัติที่ดีตั้งแต่แกะกล่อง ซึ่งรวมถึงการกำหนดลำดับความสำคัญของงาน ตั้งชื่อคิว และการลองใหม่อัตโนมัติเมื่อเกิดความล้มเหลว

งานล่าช้ายังให้วิธีกำหนดค่าเวลาทำงานสูงสุดนอกกรอบ (Sidekiq ไม่มี)

ในทางกลับกัน Sidekiq ให้การสนับสนุน Middleware เพื่ออัปเดตข้อมูลเมตาของงาน ข้ามการเข้าคิวงาน หรือดำเนินงาน Sidekiq รองรับการโทรกลับมากขึ้น แม้ว่า hook บางตัวจะพร้อมใช้งานสำหรับแอปงานที่ล่าช้าก็ตาม แทนที่จะโทรกลับ คุณสามารถใช้ Delayed Job กับ Active Job ได้ (ได้แก่ 82 และ 97 โทรกลับฝังอยู่ใน Rails)

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

งานล่าช้าไม่มี Web UI ในตัว แต่เป็น 102 ให้สิทธิ์การเข้าถึงเว็บ UI พื้นฐานพร้อมคุณสมบัติคล้ายกับ Sidekiq's

Sidekiq ชนะอย่างมีประสิทธิภาพ

ในด้านประสิทธิภาพ Sidekiq เอาชนะ Delayed Job ได้ค่อนข้างน่าเชื่อ ตามเกณฑ์มาตรฐานโอเพ่นซอร์สของ Sidekiq นั้นเร็วกว่า Delayed Job ประมาณ 30 เท่า มีเหตุผลหลักสองประการสำหรับสิ่งนี้:

  1. Redis สืบค้นข้อมูลได้เร็วกว่าฐานข้อมูลแบบเดิมอย่าง Postgres มาก เนื่องจากจะเก็บข้อมูลไว้ในหน่วยความจำแทนที่จะเป็นดิสก์
  2. งานล่าช้าจะเรียกใช้เธรดเดียวเพื่อประมวลผลงาน เปรียบเทียบกับ Sidekiq ซึ่งใช้หลายเธรด

แม้ว่าทั้งหมดนี้ดูดีบนกระดาษ แต่ความแตกต่างนั้นไม่สำคัญมากนักเว้นแต่คุณจะทำงานในปริมาณมาก (เช่น งาน 10,000 งานต่อนาที) จำนวนที่แน่นอนยังขึ้นอยู่กับระยะเวลาทำงานโดยเฉลี่ยของงานด้วย ยิ่งรันไทม์นานขึ้น ค่าใช้จ่ายในการดำเนินงานของงานที่ล่าช้าก็จะยิ่งน้อยลง

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

ใน AppSignal แดชบอร์ดเวทย์มนตร์ Sidekiq จะถูกสร้างขึ้นโดยอัตโนมัติ และช่วยให้คุณสามารถตรวจสอบความยาวของคิว เวลาแฝงของคิว ระยะเวลางาน สถานะงาน การใช้หน่วยความจำ ฯลฯ

การเลือกตัวประมวลผลงานพื้นหลังที่เหมาะสม:อธิบายงานล่าช้าเทียบกับ Sidekiq

การปรับใช้

ทั้ง Delayed Job และ Sidekiq มีกลยุทธ์การปรับใช้ที่คล้ายกันสำหรับคนทำงาน เมื่อใช้ Heroku คุณเพียงแค่ต้องเพิ่มรายการภายใน 127 ของคุณ เพื่อเริ่มตัวประมวลผลงานและรันผู้ปฏิบัติงาน

สำหรับซิเดคิค:

 

สำหรับงานล่าช้า:

 

หน่วยความจำ

นี่คือจุดที่สิ่งต่าง ๆ เริ่มน่าสนใจยิ่งขึ้น Sidekiq มีตัวเลือกการทำงานพร้อมกันเพื่อควบคุมจำนวนเธรดที่รัน เกณฑ์มาตรฐาน Sidekiq กับงานที่ล่าช้าส่วนใหญ่กล่าวถึงการทำงานพร้อมกันที่สูงมากของ Sidekiq มากถึง 25 เธรด ซึ่งมีส่วนทำให้ประสิทธิภาพการทำงานรวดเร็วเป็นพิเศษ

แต่ในสภาพแวดล้อมจริง คุณต้องจำกัดเธรดให้อยู่ในรูปแบบที่อนุรักษ์นิยมมากกว่า จำนวนที่แท้จริงขึ้นอยู่กับว่าแอปพลิเคชันของคุณหนักแค่ไหนและงานประเภทใดที่คุณทำ สิ่งที่ฉันได้เห็นในทางปฏิบัติคือ หากคุณใช้งานพนักงานบนหน่วยความจำ 512MB (เทียบเท่ากับ 133 บน Heroku) จำนวนเธรดอยู่ระหว่าง 2 ถึง 5 แทนที่จะเป็น 25

'Taming Rails memory bloat' โดย Mike Perham ผู้สร้าง Sidekiq อภิปรายการปัญหาเกี่ยวกับหน่วยความจำโดยละเอียดและคุ้มค่าที่จะอ่าน ฉันจะไม่ข้ามไปสู่การสนทนาทั้งหมด แต่เขาแนะนำให้คุณตั้งค่า 147 กับพนักงานทุกคนที่ทำงาน Sidekiq

ใช้ 154 แทนที่จะเป็น 165 ปกติ ช่วยด้วย วิธีที่แน่นอนในการทำเช่นนี้ขึ้นอยู่กับแพลตฟอร์มที่คุณใช้ แต่ Heroku นั้นค่อนข้างง่าย เพียงตั้งค่า heroku-buildpack-jemalloc เป็น buildpack แรก (นำหน้า 170 buildpack).

งานล่าช้าใช้ทรัพยากรที่ง่ายกว่า

ดังที่เราได้พูดคุยไปแล้ว งานล่าช้าจะทำงานบนอินสแตนซ์ฐานข้อมูลที่มีอยู่ของคุณ คุณอาจต้องเพิ่ม:

  • หน่วยความจำที่มีอยู่
  • พื้นที่ดิสก์
  • การเชื่อมต่อสูงสุด

ขึ้นอยู่กับปริมาณงานหรือจำนวนพนักงานที่คุณทำงาน แต่ทรัพยากรเดียวที่คุณต้องการคือตัวประมวลผลงาน

ในทางกลับกัน Sidekiq ต้องการอินสแตนซ์ Redis เพื่อจัดการงาน หากคุณใช้ Redis เป็นที่จัดเก็บแคชด้วย ขอแนะนำให้คุณใช้อินสแตนซ์แยกต่างหากที่กำหนดค่าเป็น "ร้านค้าถาวร" สำหรับงาน Sidekiq

เนื่องจาก Redis ทำงานได้ดีที่สุดเมื่อทุกอย่างพอดีกับหน่วยความจำ หากคุณมีงานมากเกินไป (เช่น หาก Sidekiq หยุดประมวลผลงานเหล่านั้นเป็นระยะเวลาหนึ่งเนื่องจากปัญหาในแอป) อาจต้องใช้เวลาหยุดทำงานบ้างเพื่อเคลียร์ทุกอย่างให้หมด นี่จะยุ่งยากเป็นพิเศษหากคุณมี Redis บนเซิร์ฟเวอร์เดียวกับแอปของคุณ งานเหล่านี้จะเริ่มแข่งขันกันเพื่อแย่งชิงหน่วยความจำ ซึ่งนำไปสู่การสลับและทำลายประสิทธิภาพของแอปของคุณในที่สุด

ประเด็นสำคัญประการหนึ่งที่ควรทราบเกี่ยวกับ Redis คือต้องกำหนดค่าด้วย 187 เพื่อหลีกเลี่ยงไม่ให้ข้อมูลของ Sidekiq ลดลงอย่างเงียบ ๆ มิฉะนั้นคุณจะพบว่าตัวเองขาดงานที่ต้องดำเนินการอย่างไร้ร่องรอย

หมายเหตุด้านข้าง:การอัปเกรดแบบชำระเงินใน Sidekiq

หากคุณต้องการคุณสมบัติพิเศษ Sidekiq จะมาพร้อมกับ 197 และ 206 เวอร์ชัน

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

เวอร์ชัน Enterprise มาพร้อมกับคุณสมบัติเพิ่มเติม หากคุณกำลังมองหาบางอย่างที่การติดตั้ง Sidekiq แบบปกติไม่สามารถแก้ไขได้ ลองสำรวจฟีเจอร์ Sidekiq แบบชำระเงิน

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

สถานะชุมชนและการพัฒนา:Sidekiq มีความได้เปรียบ

มีชุมชนขนาดใหญ่ที่อยู่เบื้องหลังทั้ง Sidekiq และ Delayed Job อย่างไรก็ตาม การหาคำตอบอย่างรวดเร็วสำหรับคำถามของคุณใน StackOverflow หรือเอกสารอย่างเป็นทางการไม่ใช่เรื่องง่ายเสมอไป

ในด้านการพัฒนา สิ่งต่างๆ ดูไม่สดใสนักสำหรับ Delayed Job มีงานเล็กๆ น้อยๆ ที่เสร็จสิ้นแล้วในเดือนธันวาคม 2021 และมกราคม 2022 แต่ดูเหมือนว่าจะไม่ได้รับการพัฒนาที่สำคัญใดๆ ในอนาคต ดูเหมือนว่าจะอยู่ในโหมดบำรุงรักษาเท่านั้น และมีปัญหาที่เปิดอยู่มากมายบน Github

ในทางตรงกันข้าม Sidekiq ยังอยู่ระหว่างการพัฒนา และผู้สร้างก็กำลังทำงานเต็มเวลาเพื่อแก้ไข มีปัญหาที่เปิดอยู่น้อยมาก และได้รับการแก้ไขเป็นประจำ

สรุป:Sidekiq หรืองานล่าช้า? ขึ้นอยู่กับความต้องการของคุณ

ในโพสต์นี้ เราได้พูดถึงระบบประมวลผลงานหลักสองระบบสำหรับแอปพลิเคชัน Rails — Sidekiq และ Delayed Job — โดยพิจารณาถึงข้อดีและข้อเสียบางประการ

มีกรณีการใช้งานที่แตกต่างกันสำหรับแต่ละกรณี ทุกอย่างขึ้นอยู่กับงบประมาณและขนาดการดำเนินงานของคุณ

หากประสิทธิภาพและการบำรุงรักษาระยะยาวมีความสำคัญ Sidekiq ก็ไม่ใช่เกมง่ายๆ ในทางกลับกัน หากต้นทุนการดำเนินงานเป็นปัญหา งานล่าช้าสามารถช่วยคุณได้

ไม่ว่าคุณจะเลือก Delayed Job หรือ Sidekiq ขอให้โชคดีกับโปรเจ็กต์ของคุณและขอให้มีความสุขกับการเขียนโค้ด!

😏 หากคุณชอบบทความนี้ โปรดดูบทความเกี่ยวกับประสิทธิภาพ Ruby (บน Rails) อื่นๆ ในรายการตรวจสอบการตรวจสอบประสิทธิภาพ Ruby ของเรา

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!