- Rails 8 डिफ़ॉल्ट स्टैक से Redis dependency को हटाता है और SolidQueue·SolidCache·SolidCable के ज़रिए सभी कामों को relational database (RDB) पर प्रोसेस करने की ओर शिफ्ट करता है
- Redis तेज़ और भरोसेमंद है, लेकिन इससे configuration·security·cluster management·backup जैसी operational complexity बढ़ती है
- SolidQueue, PostgreSQL की
FOR UPDATE SKIP LOCKED सुविधा का उपयोग करके lock contention के बिना parallel job processing लागू करता है
- recurring jobs, concurrency control, monitoring dashboard (Mission Control) जैसी Redis+Sidekiq की paid features को मुफ़्त में उपलब्ध कराता है
- ज़्यादातर Rails applications के लिए SolidQueue काफ़ी है; केवल ultra-fast·real-time processing वाले कुछ मामलों में ही Redis बनाए रखने की ज़रूरत है
Redis की छिपी हुई लागत
- Redis in सिर्फ़ hosting cost नहीं, बल्कि installation·maintenance·security configuration·HA cluster management जैसी लगातार operational overhead भी होती है
- Rails और Redis के बीच network connection और firewall setup, client authentication, Sidekiq process orchestration की ज़रूरत होती है
- समस्या आने पर Redis और RDBMS दोनों systems को साथ में debug करना पड़ता है, और dual backup strategy भी चाहिए
- इसके उलट, Redis के बिना Rails stack में सिर्फ़ PostgreSQL एक ही manage करना होता है, जिससे चीज़ें सरल हो जाती हैं
SolidQueue कैसे काम करता है
- PostgreSQL की
FOR UPDATE SKIP LOCKED सुविधा का इस्तेमाल करके कई workers lock contention के बिना एक साथ jobs उठा लेते हैं
- मुख्य table structure
solid_queue_jobs: job metadata स्टोर करता है
solid_queue_scheduled_executions: scheduled jobs की प्रतीक्षा
solid_queue_ready_executions: execution के लिए तैयार job queue
- worker·dispatcher·scheduler·supervisor processes अलग-अलग tables को समय-समय पर poll करते हुए आपस में सहयोग करते हैं
- PostgreSQL के MVCC design और autovacuum की वजह से भारी मात्रा में insert·delete operations भी स्थिर रूप से संभाले जा सकते हैं
recurring job scheduling
- SolidQueue, cron style recurring jobs को डिफ़ॉल्ट रूप से सपोर्ट करता है, और इसे
config/recurring.yml फ़ाइल में configure किया जाता है
- scheduler, execution time आने पर job को queue में डालता है और अगला execution time अपने-आप schedule कर देता है
- Fugit library natural language schedules को parse करती है, और Concurrent::ScheduledTask threads बनाता है
- GoodJob की deterministic scheduling पद्धति अपनाने से process restart के बाद भी schedule बना रहता है
concurrency control फीचर
- SolidQueue, POSIX semaphore pattern का उपयोग करके job unit के हिसाब से concurrent execution limit सपोर्ट करता है
- उदाहरण:
limits_concurrency to: 1, key: ->(user) { user.id } सेट करने पर हर user के लिए एक समय में सिर्फ़ 1 job चलेगी
- semaphore expiry (
duration) सेट करके job conflict और deadlock से बचाव किया जा सकता है
- संबंधित tables
solid_queue_semaphores: concurrency limits को track करता है
solid_queue_blocked_executions: प्रतीक्षा कर रहे jobs को स्टोर करता है
Mission Control से monitoring
- Mission Control Jobs Rails 8 के लिए एक मुफ़्त open source dashboard है, जिसे
/jobs path पर आसानी से mount किया जा सकता है
- मुख्य फीचर्स
- real-time queue status, failed jobs tracking, retry/discard control
- scheduled·recurring jobs timeline visualization
- queue-wise throughput और metrics graphs
- यह SQL-based queries सपोर्ट करता है, इसलिए अतिरिक्त tools के बिना सीधे database में analysis किया जा सकता है
Sidekiq से SolidQueue में migration
- चरण 1:
config.active_job.queue_adapter = :solid_queue सेट करें
- चरण 2:
bundle add solid_queue के बाद rails solid_queue:install और db:migrate चलाएँ
- चरण 3:
sidekiq.yml के cron schedule को recurring.yml में बदलें
- चरण 4:
Procfile में jobs: bundle exec rake solid_queue:start जोड़ें
- चरण 5: Redis·Sidekiq से जुड़े gem हटा दें
- मौजूदा ActiveJob code बिना बदलाव के वैसे ही काम करेगा
जब Redis अब भी ज़रूरी हो
- प्रति सेकंड हज़ारों से अधिक लगातार job processing
- ऐसे real-time systems जहाँ 1ms से कम latency अनिवार्य हो
- complex pub/sub structure या advanced rate limiting·counter operations की ज़रूरत
- उदाहरण के लिए Shopify, प्रति सेकंड 833 requests और 1,172 worker processes चलाते हुए Redis infrastructure का उपयोग करता है
practical implementation guide
- Rails 8 में नया app बनाते समय SolidQueue·SolidCache·SolidCable अपने-आप configure हो जाते हैं
config/database.yml में अलग queue database connection सेट करने की सिफ़ारिश की जाती है
- Mission Control authentication जोड़ें और
/jobs route mount करें
Procfile.dev में jobs: bundle exec rake solid_queue:start जोड़कर bin/dev चलाने से पूरा stack शुरू हो जाता है
- test jobs बनाने के बाद Mission Control में उनका status देखा जा सकता है
आम समस्याएँ और समाधान
- single database configuration भी संभव है, लेकिन इससे operational flexibility कम हो जाती है
- production environment में Mission Control के लिए authentication ज़रूर जोड़ें
- polling interval का डिफ़ॉल्ट मान scheduled jobs के लिए 1 सेकंड और immediate jobs के लिए 0.2 सेकंड है, जो ज़्यादातर apps के लिए उपयुक्त है
- ActionCable/Turbo Streams इस्तेमाल करते समय
SolidCable को अलग DB connection पर सेट करना चाहिए
scalability और performance
- SolidQueue ज़्यादातर Rails apps में पर्याप्त रूप से scale कर सकता है
- PostgreSQL आधारित होने के कारण प्रति सेकंड 200~300 jobs प्रोसेस कर सकता है, और 37signals रोज़ 2 करोड़ jobs बिना Redis के संभालता है
- तुलना तालिका
| मद |
Redis + Sidekiq |
SolidQueue |
| setup complexity |
अलग service चाहिए |
built-in DB का उपयोग |
| query language |
Redis commands |
SQL |
| monitoring |
अलग dashboard |
Mission Control |
| failure scenarios |
6 से अधिक |
2 |
| throughput |
हज़ारों jobs/second |
200–300 jobs/second |
| suitable for |
99.9% apps |
95% apps |
निष्कर्ष
- Redis और Sidekiq बेहतरीन तकनीकें हैं, लेकिन ज़्यादातर Rails applications के लिए वे ज़रूरत से ज़्यादा complexity और cost लाते हैं
- SolidQueue एक single-database foundation पर operations को सरल, cost को कम और maintenance को अधिक efficient बनाता है
- Rails 8 के दौर में SolidQueue पर शिफ्ट डिफ़ॉल्ट विकल्प के रूप में सुझाया जाता है
अभी कोई टिप्पणी नहीं है.