क्या आप कभी अपनी ऐप में CSV फ़ाइल से ढेर सारा डेटा आयात करना चाहते थे? या शायद आपको अपने ग्राहक समीक्षाओं में खराब एन्कोडेड वर्णों को ठीक करने की आवश्यकता है। या आपने Redis में डेटा स्टोर करने का अपना मन बदल दिया, और पुराने प्रारूप से नए प्रारूप में सब कुछ स्थानांतरित करना पड़ा।
Avvo में, हम इन्हें "एड-हॉक टास्क" कहते थे। यानी, आपको शायद इन्हें केवल एक बार चलाने की आवश्यकता है। तो Rails में एड-हॉक टास्क को संभालने का सबसे अच्छा तरीका क्या है?
डेटाबेस माइग्रेशन लिखें
अगर आपको अपने डेटाबेस में डेटा की संरचना बदलने की आवश्यकता है तो माइग्रेशन अच्छा काम करता है। यह ट्रैक करता है कि टास्क चला था या नहीं, यह अन्य वातावरणों में परिवर्तनों को आगे बढ़ाता है - यह वही है जिसके लिए माइग्रेशन बनाए गए थे। यह शायद वही है जिसके लिए आप पहले से ही उनका उपयोग कर रहे हैं।
अगर आप उसी समय डेटा बदल रहे हैं, तो माइग्रेशन काम कर सकता है। लेकिन कुछ बातों का ध्यान रखना होगा।
अपने माइग्रेशन में Permissions.create(...) जैसी किसी चीज को कॉल करना आपको मुसीबत में डाल सकता है। अगर मॉडल बदल गया है, तो आपका माइग्रेशन टूट सकता है, क्योंकि जब माइग्रेशन चलता है तो आपका मॉडल उपलब्ध नहीं हो सकता। या आपके द्वारा माइग्रेशन लिखने और उसके चलने के बीच आपका मॉडल बदल गया हो सकता है। इससे बचने के तरीके हैं, लेकिन वे त्रुटि-प्रवण हैं और अजीब तरीकों से विफल हो सकते हैं।
यदि आपका टास्क ActiveRecord से संबंधित नहीं है तो माइग्रेशन कम उपयोगी होते हैं।
ये डील-ब्रेकर नहीं हैं। लेकिन मैं माइग्रेशन में अधिक डेटा आयात या बदलाव नहीं करता। बेहतर विकल्प हैं।
Rake टास्क लिखें
आपके पास एक टास्क है। आप शायद इसे केवल एक बार चलाना चाहते हैं। और आप इसे अपनी मशीन पर टेस्ट करना और प्रोडक्शन में चलाना चाहते हैं।
Rake टास्क इसके लिए वास्तव में अच्छा काम करते हैं। Rails आपके लिए rake टास्क भी जेनरेट कर सकता है:
$ be rails g task locations import create lib/tasks/locations.rake
यह आपके कोड को रखने के लिए एक फ़ाइल बनाता है:
namespace :locations do desc "TODO" task import: :environment do end end
उस task ब्लॉक के अंदर, आप अपने सभी मॉडल और अपने Rails ऐप के बाकी कोड का उपयोग कर सकते हैं। डेटा आयात करना और बदलना आसान है, क्योंकि आप अपना कोड वैसे ही लिख सकते हैं जैसे आप Rails कंसोल पर बैठे हों।
एक बार जब आप अपना टास्क लिख लेते हैं, तो आप इसे rake locations:import के साथ चला सकते हैं। अगर आप Heroku का उपयोग कर रहे हैं, तो आप इसे heroku run rake locations:import के साथ चला सकते हैं। अगर आप Capistrano का उपयोग कर रहे हैं, तो आप अपने टास्क को चलाने के लिए capistrano-rake जेम का उपयोग कर सकते हैं। हालांकि, आपके पास एक और भी बेहतर विकल्प हो सकता है।
Sidekiq-Scheduler का उपयोग करके एक शेड्यूल्ड जॉब लिखें
यदि आपका ऐप काफी बड़ा है, तो आप शायद पहले से ही Sidekiq, Resque, या ऐसा ही कुछ उपयोग कर रहे हैं।
इनमें से अधिकांश बैकग्राउंड जॉब प्रोसेसर बाद में चलाने के लिए जॉब शेड्यूल कर सकते हैं। Sidekiq में, उदाहरण के लिए, sidekiq-scheduler जेम है। और sidekiq-scheduler के साथ, आप एक ट्रिक कर सकते हैं।
क्या होगा यदि आपके पास एक जॉब हो जो कभी स्वचालित रूप से खुद को शेड्यूल न करे, लेकिन आपको जब चाहें इसे मैन्युअली शेड्यूल करने दे? यह उन "वन-ऑफ" जॉब के लिए बहुत अच्छा काम करेगा जिन्हें आप बाद में फिर से चलाना चाह सकते हैं, या जिन्हें आप UI का उपयोग करके चलाना पसंद करेंगे।
Sidekiq-Scheduler में, आप जॉब को भविष्य में बहुत दूर शेड्यूल कर सकते हैं, और जॉब को अक्षम पर सेट कर सकते हैं:
:schedule: location_importer: class: LocationImporterWorker at: '3001/01/01' enabled: false
फिर, जब आप sidekiq-web पर जाएंगे, तो आपको जॉब को मैन्युअली एन्क्यू करने के लिए एक बटन दिखाई देगा:

इसके साथ, आप जब भी तैयार हों, विकास और प्रोडक्शन दोनों में अपना जॉब चला सकते हैं। और अगर आपको इसे फिर से चलाने की आवश्यकता है, तो यह UI में वहीं मौजूद है।
यह सबसे अच्छा विकल्प नहीं है अगर आपका जॉब खतरनाक है। उस बटन को गलती से क्लिक करना बहुत आसान है। और अगर जॉब को पूरा होने में समय लगता है तो यह भी अच्छा नहीं है, क्योंकि Sidekiq सबसे अच्छा तब काम करता है जब जॉब जल्दी खत्म हो जाएं। आपका जॉब एक वर्कर पर कब्जा कर लेगा, और आप अपने जॉब के खत्म होने तक सुरक्षित रूप से Sidekiq को रीस्टार्ट नहीं कर पाएंगे। लेकिन अगर आपका जॉब तेज है, और एक से अधिक बार सुरक्षित रूप से चल सकता है, तो यह अच्छा काम करता है। अगर यह एक सफाई का टास्क है, तो आप तय कर सकते हैं कि आप इसे नियमित रूप से चलाना चाहते हैं।
यदि आप केवल शेड्यूलिंग और ट्रिगरिंग पर ध्यान केंद्रित करना चाहते हैं, या अपने वन-टाइम स्क्रिप्ट में पैरामीटर सेट करने के लिए अधिक लचीलापन चाहते हैं, तो एक पाठक, दिमित्री ने मुझे sidekiq-enqueuer की ओर इशारा किया। Sidekiq-Enqueuer के साथ, आप Sidekiq वेब इंटरफेस के माध्यम से जॉब शेड्यूल कर सकते हैं और पैरामीटर सेट कर सकते हैं।
प्रोडक्शन में SSH करें और Rails कंसोल में कोड पेस्ट करें
सिर्फ मजाक कर रहा हूं।
आपको कौन सा चुनना चाहिए?
मैंने वन-ऑफ टास्क चलाने के इन सभी तरीकों का उपयोग किया है। लेकिन मैं आमतौर पर पहले rake टास्क के लिए जाता हूं। यह काम करता है, इसे गलती से चलाना मुश्किल है, और जब आप इसके साथ काम पूरा कर लेते हैं तो इससे छुटकारा पाना आसान होता है। मैं हर बार rake टास्क नहीं चुनता, हालांकि।
मैं माइग्रेशन चुन सकता हूं अगर:
- जॉब डेटाबेस स्कीमा परिवर्तन के हिस्से के रूप में SQL का उपयोग करके डेटा को ठीक करता है।
- जॉब बहुत सरल डेटा कार्य है, जैसे किसी कॉलम में डेटा बदलना या कुछ रिकॉर्ड जोड़ना।
- मैं आसानी से ट्रैक करना चाहता हूं कि जॉब चला है या नहीं, और इसे फिर से नहीं चलाना चाहता।
मैं Sidekiq जॉब चुन सकता हूं अगर:
- मुझे लगता है कि मैं बाद में जॉब को फिर से चलाना चाहूंगा।
- मेरे अलावा किसी और को इसे चलाना है। उन्हें बस एक बटन क्लिक करना होगा।
- यह एक छोटा डेटा आयात या डेटा सफाई जॉब है। मुझे शायद इन्हें नियमित रूप से चलाना पड़ेगा, भले ही मुझे शुरू में इसकी उम्मीद न हो।
आप कैसे हैं? क्या आपके पास कोई अन्य विकल्प हैं, या आप अलग विकल्प चुनते हैं? एक टिप्पणी छोड़ें और मुझे बताएं!