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

เลือก Background Job Processor ให้เหมาะสม: Delayed Job vs. Sidekiq Explained

แอปส่วนใหญ่ต้องการ Background Jobs สำหรับ Mailers, Regular Clean-ups, หรือ Operation ใดๆ ที่ Time-consuming ไม่ต้อง User Present

หลาย Gems Support Job Queues และ Background Processing ใน Rails World — Delayed Job และ Sidekiq เป็น 2 ตัว Popular ที่สุด

ในบทความนี้ เราจะ Detailed Look Delayed Job และ Sidekiq รวมถึง Comparison ระหว่างกัน

Let's Go!

Quick Introduction to Delayed Job

Delayed Job เป็น Direct Extraction จาก Shopify ใช้ Table Maintain Background Jobs ทั้งหมด Follow Pattern เรียบง่าย Ruby Object ใดๆ ที่ Respond to perform Method สามารถ Enqueue ใน Jobs Table

เพิ่มเติม หากไม่ต้อง Maintain Special Job Objects (แม้ Recommended สำหรับ Testability และ Clear Separation ของ Long-running Operations) มันยัง Allow เรียก .delay.method(params) บน Ruby Object ใดๆ จะ Process Method ใน Background

Delayed Job README ทำได้ดีอธิบาย Common Usage Patterns ทั้งหมด

ทีมหลายทีมเลือก Delayed Job เพราะ Simple และใช้ Existing Database อยู่แล้ว ไม่ต้อง Spend/Maintain Resources อื่น

แตจะยัง Take Up Space ใน Database Table หาก Jobs Queued มากพร้อมกัน อาจต้อง Disk Space มากขึ้น

Quick Introduction to Sidekiq

Sidekiq ใช้ Redis as Data Store Maintain Job Metadata ทั้งหมด Benefit อันชัดเจนคือ Faster มากกว่า Database Systems ธรรมดาที่ Delayed Job ใช้ เพิ่มเติม แต่ละ Sidekiq Process Spawns Multiple Threads Process Jobs 更快

สำหรับ Background Job แต่ละตัวใน Sidekiq ต้อง Specialized Class Include Sidekiq::Worker Concern และ Respond to perform Method เพื่อ Enqueue Job เรียก perform_async(arg1, arg2) บน Worker พร้อม Arguments

Sidekiq 'Getting Started' Guide อธิบายนี้และ Usage Patterns อื่นได้ดี

ใช้ Active Job กับ Delayed Job หรือ Sidekiq

Rails มี Mature Job Framework สำหรับ Top-level Declaration และ Handling Jobs ทั้งคู่ Support Running Jobs ผ่าน ActiveJob's Unified API แค่ Inherit จาก ApplicationJob และ เรียก perform_later บน Job Class Enqueue Job ไป Backend ที่ Configured

Advantage ของ Active Job คือ App Code กลายเป็น Framework Agnostic Switch จาก Delayed Job ไป Sidekiq (หรือ Vice Versa) ง่ายขึ้น ActiveJob::TestHelper ทำ Testing Enqueued Jobs ง่าย

แต Abstraction ของ Active Job มาพร้อม Performance Overhead Job Data ต้อง Wrap ก่อน Push to Store Sidekiq Claim ActiveJob ช้ากว่า ~2-20x Push Redis ~3x Processing Overhead

Delayed Jobs vs. Sidekiq

ตอนรู้ Basics มาแล้ว Deep Dive Differences และสิ่งที่แต่ละตัวนำมา

The Features

Basic Applications ทั้ง Sidekiq และ Delayed Job Provide Good Feature Set Out of the Box รวม Assign Job Priorities, Named Queues, Auto-retry on Failures

Delayed Job Provide Configure Max Run Time Out of the Box (Sidekiq ไม่มี)

Sidekiq Provide Support Middleware Update Job Metadata, Skip Queuing Job, Execute Job Sidekiq Support More Callbacks แตบาง Hooks Available สำหรับ Delayed Job Apps แทน Callbacks ใช้ Delayed Job กับ Active Job (คือ before_enqueue และ around_perform Callbacks Built-in Rails)

Web UI Feature มา Out of the Box กับ Sidekiq Provide Historical Statistics, Workers Info, Currently Enqueued/Dead Jobs สามารถ Operate Delete/Run Jobs ทันทีโดยไม่ผ่าน Console

Delayed Job ไม่มี Inbuilt Web UI แต่ delayed_job_web ให้ Basic Web UI Features เหมือน Sidekiq

Sidekiq Wins at Performance

Performance-wise Sidekiq Beats Delayed Job ค่อนข้าง Convincing ตาม Open-source Benchmark ของ Sidekiq ประมาณ 30x Faster 2 Major Reasons:

  1. Redis เร็วกว่า Traditional Databases เหมือน Postgres เพราะ Store Data ใน Memory ไม่ใช่ Disk
  2. Delayed Job Run Single Thread Process Jobs เทียบ Sidekiq ใช้ Multiple Threads

แม้ดูดีบนกระดาษ Differences ไม่ Matter มาก Unless Big Scale (ประมาณ 10k Jobs/Minute) Exact Number ขึ้นกับ Average Run Time ของ Job ยิ่ง Run Time ยาว Performance Overhead ของ Delayed Job Matter น้อยลง

หากกังวล Performance ของ Delayed Job ทำ Optimizations ได้ Indexes ที่ Exact ขึ้นกับ Statistics ของ Job System เช่นใช้ Multiple Queues และ Queue เดียวได้ Major Chunk Jobs Simple Index บน Queue Column (add_index :delayed_jobs, :queue) Improve Performance มาก

ใน AppSignal Sidekiq Magic Dashboard Auto-generated Enable Monitor Queue Length, Latency, Job Duration, Statuses, Memory Usage, etc.

เลือก Background Job Processor ให้เหมาะสม: Delayed Job vs. Sidekiq Explained

Deployment

ทั้งคู่ Deployment Strategy คล้ายกันสำหรับ Workers ใช้ Heroku เพิ่ม Entries ใน Procfile Start Job Processor และ Run Workers

For Sidekiq:


For Delayed Job:



Memory

นี่จุดเริ่ม Interesting Sidekiq มี Concurrency Option Control Threads ที่ Run Sidekiq vs Delayed Job Benchmarks เยอะ Mention High Concurrency ถึง 25 Threads Contribute Super-fast Performance

แต Real Setting ต้อง Limit Threads Conservative จริง ขึ้นกับ Heavy App และ Job Types Practical Experience ถ้า Run Worker บน 512MB Memory (เทียบ standard-1x Heroku) Threads ระหว่าง 2-5 แทน 25

'Taming Rails memory bloat' by Mike Perham Creator of Sidekiq Discuss Memory Issues 详细 Worth Read ผมไม่ Jump Full Discussion แต่เขา Recommend Set MALLOC_ARENA_MAX=2 บน Workers ทั้งหมด Run Sidekiq

ใช้ jemalloc แทน malloc ช่วยได้ Exact Way ขึ้นกับ Platform แต Simple บน Heroku Set heroku-buildpack-jemalloc เป็น First Buildpack (Ahead of heroku/ruby)

Delayed Job Uses Simpler Resources

Delayed Job Run บน Existing Database Instance คุณอาจต้อง Increase:

  • Available Memory
  • Disk Space
  • Max Connections

ขึ้นกับ Job Load หรือ Workers ที่ Run แต่ Resource ที่ต้องการแค่ Job Processor

Sidekiq ต้อง Redis Instance Handle Jobs หากใช้ Redis as Cache Store แนะนำ Separate Instance Configured as "Persistent Store" สำหรับ Sidekiq Jobs

เพราะ Redis Works Best เมื่อ Everything Fits in Memory หาก Jobs เยอะเกิน (เช่น Sidekiq Stop Processing เนื่องจาก App Issue) อาจ Downtime Clear ทุกอย่าง Troublesome หาก Redis บน Server เดียวกับ App พวกเขา Compete Memory Leading to Swapping และ Destroy App Performance

Important Point: Redis ต้อง Configure maxmemory-policy noeviction เพื่อ Avoid Silent Drops ของ Sidekiq Data มิฉะนั้นจะ Missing Jobs ที่ต้อง Perform โดยไม่มี Trace

A Side-Note: Paid Upgrades ใน Sidekiq

หากต้อง Extra Features Sidekiq มี Versions Pro และ Enterprise

Notable Addition ใน Pro คือ Batch Jobs Run Parallel, Monitored, Interact as Group Invoke Callback เมื่อ Jobs ทั้งหมด Done Pro มี Improved Reliability Features Ensure No Jobs Dropped Silently Even During Network Problems

Enterprise Version มาพร้อม Features มากกว่า หากมองหาอะไรที่ Regular Sidekiq ไม่แก้ได้ Explore Paid Sidekiq Features

Practice Free Version Sidekiq Works Great แตดีที่รู้ว่ามี Paid Options Upgrade ได้ As Needed แทน Switch ไป Solution อื่น

Community และ Development Status: Sidekiq Has the Edge

Huge Community 后面 Both Sidekiq และ Delayed Job แตไม่ Always Easy หา Quick Answers ใน StackOverflow หรือ Official Docs

Development Side ไม่ Bright สำหรับ Delayed Job Minor Work December 2021 January 2022 แตไม่ดูเหมือน Major Developments Going Forward Appear Maintenance-only Mode Open Issues เยอะบน Github

Contrast Sidekiq Still Active Development Creator Working Full Time Open Issues น้อย และ Addressed Regularly

Wrap-up: Sidekiq หรือ Delayed Job? ขึ้นกับ Needs ของคุณ

ในบทความนี้ Cover 2 Major Job Processing Systems สำหrails Apps — Sidekiq และ Delayed Job — Look Pros และ Cons

มี Different Use Cases แต่ละตัว ขึ้นกับ Budget และ Scale ของ Operation

ถ้า Performance และ Long-term Maintainability Important Sidekiq No-brainer อีกฝ่ายถ้า Running Costs Concern Delayed Job ช่วยได้

無論選 Delayed Job หรือ Sidekiq Good Luck Project และ Happy Coding!

👋 ถ้าชอบบทความนี้ ดู Ruby (on Rails) Performance Articles อื่นใน Ruby Performance Monitoring Checklist

P.S. หากต้องการอ่านบทความ Ruby Magic ทันทีที่เผยแพร่ สมัคร Newsletter Ruby Magic ของเราและจะไม่พลาดบทความเด็ดๆ ไป!