นักพัฒนา Ruby ถกเถียงระหว่าง Solid Queue กับ Sidekiq สำหรับการประมวลผลงานเบื้องหลัง

ทีมชุมชน BigGo
นักพัฒนา Ruby ถกเถียงระหว่าง Solid Queue กับ Sidekiq สำหรับการประมวลผลงานเบื้องหลัง

นักพัฒนา Ruby on Rails กำลังหารือกันอย่างกระตือรือร้นเกี่ยวกับข้อดีของ Solid Queue ซึ่งเป็นระบบประมวลผลงานที่รองรับด้วยฐานข้อมูลใหม่ที่มาพร้อมกับ Rails 8 เป็นทางเลือกแทน Sidekiq ที่ได้รับความนิยม การสนทนานี้ได้จุดประกายการถกเถียงที่น่าสนใจเกี่ยวกับตัวเลือกสถาปัตยกรรม การแลกเปลี่ยนประสิทธิภาพ และปรัชญาที่กว้างขึ้นของการประมวลผลงานเบื้องหลังในเว็บแอปพลิเคชัน

สถาปัตยกรรมแบบ Database-Backed เทียบกับ Redis-Based

ความแตกต่างพื้นฐานระหว่าง Solid Queue และ Sidekiq อยู่ที่กลไกการจัดเก็บข้อมูล Solid Queue ใช้ฐานข้อมูลที่มีอยู่แล้วในการจัดเก็บและจัดการงาน ซึ่งช่วยขจัดความจำเป็นในการใช้ Redis เป็น dependency ภายนอก แนวทางนี้ดึงดูดนักพัฒนาที่ชอบการตั้งค่าโครงสร้างพื้นฐานที่เรียบง่าย โดยเฉพาะผู้ที่เพิ่งเริ่มต้นหรือทำงานในสภาพแวดล้อมที่ต้องการการตรวจสอบ dependency ภายนอกอย่างละเอียด

อย่างไรก็ตาม การสนทนาในชุมชนเผยให้เห็นความรู้สึกที่หลากหลายเกี่ยวกับการใช้ฐานข้อมูลเป็น job queue นักพัฒนาบางคนแบ่งปันเรื่องราวเตือนใจเกี่ยวกับความพยายามในช่วงแรกๆ ที่ใช้ PostgreSQL เป็น task queue ซึ่งส่งผลให้เกิดประสิทธิภาพที่ไม่ดีเนื่องจากการออกแบบฐานข้อมูลที่ไม่เหมาะสม คนอื่นๆ ชี้ให้เห็นว่าการใช้งานสมัยใหม่อย่าง Solid Queue ได้เรียนรู้จากข้อผิดพลาดในช่วงแรกเหล่านี้และให้ลักษณะประสิทธิภาพที่ดีกว่า

ความแตกต่างหลัก: Solid Queue เทียบกับ Sidekiq

คุณสมบัติ Solid Queue Sidekiq
Storage Backend ฐานข้อมูล (PostgreSQL/MySQL) Redis
External Dependencies ไม่มี (ใช้ฐานข้อมูลที่มีอยู่) ต้องการเซิร์ฟเวอร์ Redis
การรวมเข้ากับ Rails ติดตั้งมาใน Rails 8 เป็น gem ของบุคคลที่สาม
ความซับซ้อนในการติดตั้ง ต่ำกว่า สูงกว่า (การจัดการ Redis)
ประสิทธิภาพ ขึ้นอยู่กับฐานข้อมูล โดยทั่วไปเร็วกว่า
การตรวจสอบ มีพื้นฐานในตัว ระบบนิเวศที่เป็นผู้ใหญ่
Feature flags แสดงให้เห็นความสำคัญของการปรับแต่งประสิทธิภาพในระบบประมวลผลงานอย่าง Solid Queue และ Sidekiq
Feature flags แสดงให้เห็นความสำคัญของการปรับแต่งประสิทธิภาพในระบบประมวลผลงานอย่าง Solid Queue และ Sidekiq

การถกเถียงปรัชญาสถาปัตยกรรม Queue

ส่วนสำคัญของการสนทนาในชุมชนมุ่งเน้นไปที่ปรัชญาที่กว้างขึ้นของการใช้ queue เพื่อแก้ปัญหาประสิทธิภาพ นักพัฒนาบางคนแสดงความกังวลเกี่ยวกับทีมที่เอาการดำเนินการที่ช้าทุกอย่างใส่ลงใน queue โดยไม่พิจารณาทางเลือกอื่นๆ เช่น การปรับปรุงประสิทธิภาพ query หรือ caching

มีสองพื้นที่หลักที่ผมเห็นทีมต่างๆ ได้รับผลกระทบจากเรื่องนี้โดยส่วนตัว: นักออกแบบไม่เข้าใจว่าสิ่งต่างๆ จะเกิดขึ้นแบบ async และ UI ในที่สุดก็ต้องการสร้างสมมติฐานว่าทุกอย่างเกิดขึ้นแบบ real time

การสนทนาเน้นย้ำถึงความท้าทายในโลกจริง รวมถึงความซับซ้อนของการจัดการข้อผิดพลาด บั๊กของระบบกระจาย และความยากลำบากในการติดตามปัญหาข้ามหลายระบบ queue ปัญหาเหล่านี้จะรุนแรงขึ้นโดยเฉพาะในการปรับใช้หลายภูมิภาคที่งานอาจข้ามศูนย์ข้อมูล

กรณีการใช้งาน Background Job ทั่วไปที่มีการพูดถึง:

  • การส่งอีเมลและการแจ้งเตือน
  • การสร้าง PDF และการประมวลผลไฟล์
  • การนำเข้าและส่งออกข้อมูล
  • การเรียกใช้ API ของบุคคลที่สาม
  • งานที่กำหนดเวลาแบบวนซ้ำ (ฟังก์ชันคล้าย cron)
  • เวิร์กโฟลว์หลายขั้นตอนและไปป์ไลน์การประมวลผลข้อมูล
  • การประมวลผลและการแปลงรูปภาพ/สื่อ

ข้อพิจารณาด้านประสิทธิภาพและการตรวจสอบ

แม้ว่าบทความต้นฉบับจะกล่าวถึงว่า Solid Queue มีความเร็วอย่างเหลือเชื่อ แต่การสนทนาในชุมชนเผยให้เห็นความกระหายสำหรับการเปรียบเทียบประสิทธิภาพที่เป็นรูปธรรม นักพัฒนากำลังขอ benchmark ที่เปรียบเทียบ Solid Queue กับโซลูชันที่มีชื่อเสียงอย่าง Sidekiq และแม้แต่ทางเลือกข้ามภาษาอย่าง Oban สำหรับ Elixir

ด้านการตรวจสอบก็ได้รับความสนใจเช่นกัน โดยนักพัฒนาสังเกตว่า error logging และ retry logic ที่เหมาะสมจะกลายเป็นสิ่งสำคัญเมื่อย้ายการดำเนินการไปยัง background job การสนทนาเน้นย้ำว่าแตกต่างจากการดำเนินการแบบ synchronous ที่ข้อผิดพลาดจะเห็นได้ทันที background job อาจล้มเหลวอย่างเงียบๆ หากไม่ได้รับการตรวจสอบอย่างเหมาะสม

เมตริกประสิทธิภาพของงานเน้นการเปรียบเทียบความสามารถในการประมวลผลระหว่าง Solid Queue และ Sidekiq
เมตริกประสิทธิภาพของงานเน้นการเปรียบเทียบความสามารถในการประมวลผลระหว่าง Solid Queue และ Sidekiq

การรวม Rails 8 และแนวโน้มอนาคต

การรวม Solid Queue ใน Rails 8 เป็นการเปลี่ยนแปลงที่สำคัญสำหรับเฟรมเวิร์กซึ่งพึ่งพาโซลูชันของบุคคลที่สามอย่าง Sidekiq และ Resque สำหรับการประมวลผล background job มานานกว่า 20 ปี โซลูชันในตัวนี้สามารถลดอุปสรรคสำหรับนักพัฒนาที่เคยหลีกเลี่ยง background job เนื่องจากความซับซ้อนของโครงสร้างพื้นฐาน

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

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

อ้างอิง: A Deep Dive Into Solid Queue for Ruby on Rails