Sidekiq ช่วยให้นักพัฒนา Ruby รักษา web applications ให้เร็วและตอบสนองได้ โดยการย้าย time-consuming tasks ไป background
ด้วย multithreading ที่ core Sidekiq สามารถ process หลาย jobs พร้อมกันได้ นี่ทำให้ Sidekiq เป็นส่วนสำคัญของ Ruby หรือ Rails applications ที่จัดการ heavy loads หรือทำ tasks เช่น ส่งอีเมล หรือประมวลผลไฟล์ โดยไม่มี background processing long-running tasks จะ block main thread ของแอปพลิเคชัน ทำให้ response times ช้าและ user experience แย่
ในโพสต์นี้ เราจะเน้นที่การใช้ Sidekiq อย่างมีประสิทธิภาพเพื่อจัดการและ process background jobs
มาเริ่มกัน!
The Basics of Sidekiq (พื้นฐานของ Sidekiq)
ใน essence Sidekiq เป็น full-featured background processing framework สำหรับ Ruby มันให้คุณรัน background tasks concurrently สำคัญสำหรับ responsive และ reliable web applications ไม่ว่าจะส่งอีเมล, resize รูปภาพ หรือ process CSV files time-consuming tasks สามารถทำได้เบื้องหลังด้วย Sidekiq
สถาปัตยกรรมของ Sidekiq พึ่งพา multithreading และ concept ของ "workers" มาก อย่างไรก็ตาม ตั้งแต่ Sidekiq 6.3.0 โมดูล Sidekiq::Worker ถูก deprecated เพื่อ Sidekiq::Job เนื่องจาก terminology "worker" อาจสับสน:
คุณพูดถึง process? thread? ประเภทของ job? ผมส่งเสริมให้นักพัฒนาหยุดใช้คำว่า worker
Redis, lightning-fast in-memory database เล่นบทบาทสำคัญที่นี่ ทำหน้าที่เป็น queue system ที่เก็บ background jobs เหล่านี้
Note: แม้ Sidekiq จะพึ่งพา Redis สำหรับ storage เราจะไม่ได้ลงรายละเอียด Redis configuration และ usage ในบทความนี้
การติดตั้งและ Setup Sidekiq สำหรับ Rails
เริ่มต้น คุณจะต้องรัน Ruby version 2.5 หรือใหม่กว่า และ Redis server version 4 หรือใหม่กว่า
ตอนนี้คุณพร้อมติดตั้ง Sidekiq Ruby gem
เริ่มต้นด้วยการเพิ่ม Sidekiq ลงใน Gemfile ของแอปพลิเคชัน:
ต่อไป ติดตั้งมันใน directory ของโปรเจกต์:
ตอนนี้ Sidekiq ติดตั้งแล้ว คุณจะต้อง config มัน ใน Rails application คุณ config Sidekiq เป็น ActiveJob adapter เปิด config/application.rb และเพิ่มบรรทัดต่อไปนี้ภายใน application class definition:
คุณสามารถ config Sidekiq เพิ่มเติมได้โดยการสร้าง Sidekiq initializer เพื่อ point ไปที่ Redis instance ตัวอย่างเช่น นี่คือ special script ใน Rails ที่รันเมื่อแอปพลิเคชันเริ่มต้น
ใน config/initializers สร้างไฟล์ชื่อ sidekiq.rb ภายในไฟล์นี้ คุณสามารถระบุ Sidekiq configurations ต่างๆ ตัวอย่างเช่น:
Configuration นี้บอก Sidekiq ให้ connect ไป local Redis server แน่นอนว่าใน production environment คุณจะแทนที่ local URL ด้วย actual Redis server (นี่เป็นที่ยอดเยี่ยมสำหรับ environment variable)
และแค่นั้น! ด้วย Sidekiq ติดตั้งและ config แล้ว คุณพร้อมเริ่มสร้างและ process jobs ใน background ของ Rails application
การตั้งค่า Sidekiq Job
นี่คือวิธี setup และ initialize basic Sidekiq job:
เพื่อจริงๆ queue job ให้รัน คุณเรียกเมธอด perform_async บน job class แบบนี้:
บรรทัดนี้เพิ่ม job ไปที่ default queue ที่ execute ทันทีที่ job พร้อม available Arguments 'some_name' และ 42 ถูกส่งไปที่ perform method SomeNameForAJob เมื่อ execute
จากที่นี่ Sidekiq client push job เข้า queue ใน Redis และ Sidekiq server pull job นั้นออกจาก queue เมื่อพร้อม process
การสร้าง Sidekiq Job แรกของคุณ
ใน Sidekiq jobs ถูกแทนโดย job classes และ tasks ที่พวกเขาต้อง perform ถูก define ในเมธอด perform มาสร้าง basic Sidekiq job:
ใน code snippet นี้ เราสร้างคลาส HelloNameJob มันรับสอง arguments: name และ times เมื่อ performed มัน print greeting ไปที่ console จำนวนครั้งที่ระบุ นี้เป็นตัวอย่าง simple แน่นอนว่าใน real-world application perform method สามารถมีโค้ดใดๆ ที่คุณอยากรันใน background
ตอนนี้ execute job ของคุณ เพียงแค่เรียก perform_async method บน class และส่ง arguments ที่ perform method คาดหวัง นี่คือวิธี schedule HelloNameJob ที่เราสร้าง:
นี่จะ enqueue job เพื่อ print "Hello, Jeff!" ห้าครั้ง
หากคุณต้องการ job ที่ performed ในเวลาเฉพาะ คุณสามารถใช้ perform_in หรือ perform_at methods ตัวอย่างเช่น:
ในตัวอย่างเหล่านี้ 'Meredith' จะได้ greeting สามครั้งในห้านาที ในขณะที่ 'Jeff' จะต้องรอสองวันเพื่อรับ greeting สองครั้ง
Advanced Sidekiq Usage (การใช้งาน Sidekiq ขั้นสูง)
Sidekiq ไม่จำกัดแค่ offload งานไป background มันยังเสนอ advanced features ที่ให้คุณ config jobs รวมถึง job retries และ job prioritization
Automatic Job Retries (การลองใหม่อัตโนมัติ)
หนึ่งใน most powerful features ของ Sidekiq คือ automatic job retries โดย default หาก job fails เนื่องจาก unhandled exception Sidekiq จะ retry job ด้วย exponential backoff คุณสามารถ customize จำนวน retries โดยระบุ sidekiq_options ในคลาสแบบนี้:
ในตัวอย่างนี้ หาก job fails Sidekiq จะ retry มันสิบครั้งก่อนจะยอมแพ้
Job Prioritization (การจัดลำดับความสำคัญของ Job)
Job prioritization เป็น advanced feature อีกอย่างที่ Sidekiq ให้ คุณสามารถควบคุม priority ของ jobs โดย assign พวกเขาไป different queues และตั้งค่า priority ของแต่ละ queue นี่คือวิธีระบุ queue เมื่อ define job:
ในตัวอย่างนี้ jobs สำหรับ ThisJob จะถูกวางใน critical queue เมื่อเริ่ม Sidekiq server คุณสามารถระบุลำดับที่ queues ควร processed ได้
นี่เป็นเพียงตัวอย่างสองอย่างของวิธีที่ Sidekiq's advanced features สามารถ leveraged ได้เพื่อ fine-tune background job processing ด้วย Sidekiq คุณมี tools ให้แน่ใจว่า jobs ของคุณถูก processed อย่างมีประสิทธิภาพ น่าเชื่อถือ และแบบที่เหมาะกับความต้องการของแอปพลิเคชันมากที่สุด
Monitoring และ Scaling ด้วย Sidekiq
Sidekiq มาพร้อม standard features สำหรับ monitoring และ scaling job processing capabilities Web-based dashboard ให้ real-time view ของ job queues คุณเห็นจำนวน processed และ failed jobs รวมถึง detailed information เกี่ยวกับ current และ scheduled jobs
เพื่อใช้ Sidekiq dashboard ให้ mount มันใน Rails routes file ใน config/routes.rb เพิ่ม:
หลังจากเพิ่มบรรทัดเหล่านี้ คุณสามารถเข้าถึง dashboard โดย navigate ไป '/sidekiq' บน server
การ Monitor Sidekiq ด้วย AppSignal
สำหรับ comprehensive monitoring Sidekiq integrate ได้ดีกับ application performance monitoring tools อย่าง AppSignal AppSignal's Sidekiq dashboard ให้ detailed insights เข้าไปใน Sidekiq jobs รวมถึง failed และ retried jobs, job duration, และ Redis memory usage

ประเภทข้อมูลนี้มีค่ามากสำหรับการระบุ bottlenecks ขณะที่คุณ scale แอปพลิเคชัน ข้างนั้น AppSignal's alerts ช่วยคุณ stay on top ของ anomalies เช่น queue length ดังนั้นคุณรู้เมื่อ queues ของคุณโตขึ้น

การ integrate AppSignal เข้าไปใน Sidekiq setup ด้วย Rails เรียบง่าย AppSignal's Ruby gem inserts เข้า Sidekiq server middleware โดยไม่ต้อง extra configuration นี้ยังทำงานกับ ActiveJob!
คุณแม้แต่สามารถใช้ AppSignal สำหรับ Sidekiq application ที่ไม่รันบน Rails ได้ โดยใช้ setup ที่กล่าวใน docs
A Sidekiq Use Case (กรณีการใช้งาน Sidekiq)
Two ของ most common use cases สำหรับ Sidekiq คือ asynchronous emailing และ scheduled report generation มาดูใกล้ชิดหนึ่งในตัวอย่างเหล่านี้
Emails โดยเฉพาะที่มี large attachments หรือ numerous recipients อาจใช้เวลาสำคัญในการส่ง โดยการจัดการ email sending ใน background job แอปพลิเคชันของคุณสามารถตอบสนอง user requests ได้ต่อไป ในขณะที่อีเมลกำลัง processed
นี่คือตัวอย่างง่ายของ Sidekiq job สำหรับส่งอีเมลใน Rails application:
ในตัวอย่างนี้ ResetPasswordJob ใช้ UserMailer class ส่ง password reset email ให้ user เพื่อ enqueue email ให้ส่ง คุณเรียก ResetPasswordJob.perform_async(user_id) จากที่อื่นในแอปพลิเคชัน
อย่างไรก็ตาม ใน typical Rails application คุณมักไม่ต้องสร้าง Sidekiq job แยกสำหรับส่งอีเมล Rails มี Action Mailer framework ซึ่งใช้ส่งอีเมลและ integrate เนียนกับ Active Job สำหรับ background processing
นี่คือตัวอย่างว่าคุณอาจใช้ Active Job และ Action Mailer ส่ง password reset email:
ในตัวอย่างนี้ การเรียก deliver_later บน mailer จะ enqueue email ให้ส่งเป็น background job โดยอัตโนมัติ ข้างหลัง Active Job ใช้ Sidekiq จัดการ jobs เหล่านี้
แต่ถ้าคุณอยาก more control over jobs — เช่น อยาก customize retry behavior หรือ queue prioritization — หรือถ้าคุณ deal กับ tasks ที่ไม่ integrate กับ Active Job ง่ายเท่า Action Mailer แล้วเหมาะสมที่จะสร้าง Sidekiq jobs แยก
Flexibility นี้ ร่วมกับ performance และ ease of use ของ Sidekiq ทำให้มันเป็น valuable tool สำหรับจัดการ background tasks ต่างๆ ใน Rails applications
สรุป
ในโพสต์นี้ เราเดินผ่าน introduction to Sidekiq สำรวจ basics, ดำดิ่งสู่ installation และ setup และสร้างและ execute useful jobs
เรายังแตะ advanced features ของ Sidekiq ดู real-world use cases และอภิปรายบทบาทสำคัญในการปรับปรุง performance และ scalability ของ Ruby applications
armed with knowledge จาก introduction นี้ คุณตอนนี้พร้อมที่จะเริ่มใช้ Sidekiq อย่างมีประสิทธิภาพมากขึ้นใน Rails apps ของตัวเอง
Happy coding!
P.S. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ ให้สมัครสมาชิก newsletter Ruby Magic ของเรา และจะไม่พลาดโพสต์เด็ดๆ ไป!