কম্পিউটার

রেলে একটি ওয়ান-টাইম স্ক্রিপ্ট লেখা

আপনি কি কখনও একটি CSV ফাইল থেকে আপনার অ্যাপে একগুচ্ছ ডেটা আমদানি করতে চেয়েছেন? অথবা হয়ত আপনাকে আপনার কিছু গ্রাহক পর্যালোচনাতে খারাপভাবে এনকোড করা অক্ষর ঠিক করতে হবে। অথবা আপনি কীভাবে রেডিসে ডেটা সঞ্চয় করতে চান সে সম্পর্কে আপনার মন পরিবর্তন করেছেন, এবং পুরানো ফর্ম্যাট থেকে নতুন ফর্ম্যাটে সবকিছু সরাতে হবে৷

Avvo-তে, আমরা এইগুলিকে "অ্যাড-হক টাস্ক" বলে থাকি। হিসাবে, আপনি সম্ভবত শুধুমাত্র একবার তাদের চালানো প্রয়োজন. তাহলে রেলে একটি অ্যাড-হক কাজ পরিচালনা করার সর্বোত্তম উপায় কী?

একটি ডাটাবেস মাইগ্রেশন লিখুন

আপনার ডাটাবেসের ডেটার গঠন পরিবর্তন করতে হলে মাইগ্রেশন ভালো কাজ করে। এটি কাজটি চালানো হয়েছে কিনা তা ট্র্যাক করে, এটি অন্যান্য পরিবেশে পরিবর্তনগুলি বহন করে – এটিই মাইগ্রেশনগুলি নির্মিত জন্য আপনি সম্ভবত ইতিমধ্যেই এটি ব্যবহার করছেন।

যদি আপনি একই সময়ে ডেটা পরিবর্তন করেন, একটি মাইগ্রেশন হতে পারে ভাল কাজ. কিন্তু কিছু জিনিস খেয়াল রাখতে হবে।

Permissions.create(...) এর মত কিছু কল করা হচ্ছে আপনার মাইগ্রেশনে আপনার সমস্যা হতে পারে। মডেল পরিবর্তিত হলে, আপনার মাইগ্রেশন ভেঙ্গে যেতে পারে, কারণ মাইগ্রেশন চলাকালীন আপনার মডেল উপলব্ধ নাও হতে পারে। অথবা আপনি মাইগ্রেশন লেখার সময় এবং এটি চালানোর মধ্যে আপনার মডেল পরিবর্তিত হতে পারে। এটির আশেপাশে যাওয়ার উপায় রয়েছে, তবে সেগুলি ত্রুটি-প্রবণ এবং অদ্ভুত উপায়ে ব্যর্থ হতে পারে৷

আপনার টাস্কে ActiveRecord জড়িত না থাকলে মাইগ্রেশনও কম কার্যকর।

এগুলি চুক্তি-ব্রেকার নয়। কিন্তু আমি মাইগ্রেশনে বেশি ডেটা আমদানি বা পরিবর্তন করার প্রবণতা রাখি না। আরও ভাল বিকল্প আছে৷

একটি রেক টাস্ক লিখুন

তোমার একটা টাস্ক আছে। আপনি সম্ভবত এটি একবার চালাতে চান। এবং আপনি এটিকে আপনার মেশিনে পরীক্ষা করতে এবং উত্পাদনে চালাতে সক্ষম হতে চান৷

রেক টাস্কগুলি এর জন্য সত্যিই ভাল কাজ করে৷৷ রেল এমনকি আপনার জন্য রেক টাস্ক তৈরি করতে পারে:

$ be rails g task locations import
      create  lib/tasks/locations.rake

এটি একটি ফাইল তৈরি করে যাতে আপনি আপনার কোডকে এতে লুকিয়ে রাখতে পারেন:

lib/tasks/locations.rake
namespace :locations do
  desc "TODO"
  task import: :environment do

  end
end

সেই task এর ভিতরে ব্লক করুন, আপনি আপনার রেল অ্যাপে আপনার সমস্ত মডেল এবং বাকি কোড ব্যবহার করতে পারেন। ডেটা আমদানি করা এবং পরিবর্তন করা সহজ, কারণ আপনি আপনার কোড লিখতে পারেন ঠিক যেমন আপনি একটি Rails কনসোলে বসে ছিলেন৷

একবার আপনি আপনার টাস্ক লিখে ফেললে, আপনি এটিকে rake locations:import দিয়ে চালাতে পারেন . আপনি যদি Heroku ব্যবহার করেন, তাহলে আপনি এটি heroku run rake locations:import দিয়ে চালাতে পারেন . আপনি যদি Capistrano ব্যবহার করেন তবে আপনি আপনার টাস্ক চালানোর জন্য capistrano-rake রত্ন ব্যবহার করতে পারেন। যদিও আপনার কাছে আরও ভালো বিকল্প থাকতে পারে।

Sidekiq-scheduler ব্যবহার করে একটি নির্ধারিত কাজ লিখুন

আপনার অ্যাপ যথেষ্ট বড় হলে, আপনি সম্ভবত ইতিমধ্যে Sidekiq, Resque, বা এরকম কিছু ব্যবহার করছে৷

এই ব্যাকগ্রাউন্ড জব প্রসেসরগুলির বেশিরভাগই পরে চালানোর জন্য কাজের সময় নির্ধারণ করতে পারে। Sidekiq-এ, উদাহরণস্বরূপ, sidekiq-শিডিউলার রত্ন আছে। এবং sidekiq-শিডিউলারের সাথে, আপনি করতে পারেন এমন একটি কৌশল রয়েছে৷

আপনার যদি এমন একটি চাকরি থাকে যা কখনোই স্বয়ংক্রিয়ভাবে না থাকে নিজেই নির্ধারিত, কিন্তু আপনাকে ম্যানুয়ালি করতে দিন আপনি যখনই চান তখনই এটি নির্ধারণ করুন? এটি "ওয়ান-অফ" কাজের জন্য দুর্দান্ত কাজ করবে যেগুলি আপনি পরে আবার চালাতে চাইতে পারেন, অথবা আপনি বরং একটি UI ব্যবহার করে চালাতে চান৷

sidekiq-শেডিউলারে, আপনি ভবিষ্যতে অনেক দূর কাজের সময়সূচী করতে পারেন এবং কাজটিকে অক্ষম হিসাবে সেট করতে পারেন:

sidekiq.yml
:schedule:
  location_importer:
    class: LocationImporterWorker
    at: '3001/01/01'
    enabled: false

তারপর, আপনি যখন sidekiq-web এ যান, তখন আপনি কাজটি ম্যানুয়ালি সারিবদ্ধ করার জন্য একটি বোতাম দেখতে পাবেন:

রেলে একটি ওয়ান-টাইম স্ক্রিপ্ট লেখা

এটির সাহায্যে, আপনি যখনই প্রস্তুত থাকবেন তখনই আপনি আপনার কাজ চালাতে পারবেন, উন্নয়ন এবং উৎপাদন উভয় ক্ষেত্রেই। এবং যদি আপনার এটিকে আবার চালানোর প্রয়োজন হয় তবে এটি UI-তে রয়েছে।

আপনার কাজ বিপজ্জনক হলে এটি সেরা বিকল্প নয়। ঘটনাক্রমে সেই বোতামটি ক্লিক করা খুব সহজ। এবং কাজটি সম্পূর্ণ হতে কিছুটা সময় লাগলেও এটি দুর্দান্ত নয়, কারণ কাজগুলি দ্রুত শেষ হলে Sidekiq সবচেয়ে ভাল কাজ করে। আপনার কাজ একজন কর্মীকে নেবে, এবং আপনার কাজ শেষ না হওয়া পর্যন্ত আপনি নিরাপদে Sidekiq পুনরায় চালু করতে পারবেন না। কিন্তু আপনার কাজ যদি দ্রুত হয়, এবং নিরাপদে একাধিকবার চালানো যায়, তাহলে এটি ভালো কাজ করে। যদি এটি একটি ক্লিনআপ ধরনের কাজ হয়, তাহলে আপনি সিদ্ধান্ত নিতে পারেন যে আপনি চান৷ এটি নিয়মিত চালানোর জন্য।

আপনি যদি শুধুমাত্র সময় নির্ধারণ এবং ট্রিগার করার উপর ফোকাস করতে চান, বা আপনার এককালীন স্ক্রিপ্টগুলিতে প্যারাম সেট করার জন্য আরও নমনীয়তার প্রয়োজন হয়, একজন পাঠক, দিমিত্রি, আমাকে সাইডকিক-এনকিউয়ারের দিকে নির্দেশ করেছেন। sidekiq-enqueuer-এর সাহায্যে, আপনি Sidekiq ওয়েব ইন্টারফেসের মাধ্যমে কাজের সময়সূচী এবং প্যারাম সেট করতে পারেন।

SSH উৎপাদনে এবং রেল কনসোলে কোড পেস্ট করুন

শুধু মজা করছি।

আপনি কোনটি বেছে নেবেন?

আমি এক-অফ কাজ চালানোর জন্য এই সমস্ত উপায় ব্যবহার করেছি। কিন্তু আমি সাধারণত প্রথমে একটি রেক টাস্কের জন্য যাই। এটি কাজ করে, এটি দুর্ঘটনাক্রমে চালানো কঠিন, এবং আপনি এটি সম্পন্ন করলে পরিত্রাণ পাওয়া সহজ। যদিও আমি প্রতিবার রেক টাস্ক বেছে নিই না।

আমি একটি মাইগ্রেশন বেছে নিতে পারি যদি:

  • কাজটি ডাটাবেস স্কিমা পরিবর্তনের অংশ হিসাবে SQL ব্যবহার করে ডেটা ঠিক করে।
  • কাজটি খুবই সাধারণ ডেটা কাজ, যেমন একটি কলামে ডেটা পরিবর্তন করা বা কয়েকটি রেকর্ড যোগ করা।
  • আমি সহজে ট্র্যাক করতে চাই কাজটি চালানো হয়েছে কিনা, আবার চালানো হবে না।

আমি একটি Sidekiq চাকরি বেছে নিতে পারি যদি:

  • আমার মনে হয় আমি হয়তো পরে আবার চাকরি চালাতে চাই।
  • যে আমি নই তাকে এটি চালাতে হবে। তাদের যা করতে হবে তা হল একটি বোতামে ক্লিক করুন৷
  • এটি একটি সংক্ষিপ্ত ডেটা আমদানি বা ডেটা পরিষ্কার করার কাজ৷ আমি সম্ভবত সেগুলি নিয়মিত চালাতে হবে, যদিও আমি প্রথমে আশা না করি।

তোমার কী অবস্থা? আপনার কি অন্য কোন বিকল্প আছে, বা বিভিন্ন পছন্দ করতে? একটি মন্তব্য করুন এবং আমাকে জানান!


  1. স্ট্রাইপ সহ রেলগুলিতে কীভাবে এককালীন ক্রয় বিক্রি করবেন

  2. রেলের সাথে হটওয়্যার ব্যবহার করা

  3. AWS Lambda এ রেল স্থাপন করা হচ্ছে

  4. রেলের সাথে কৌণিক ব্যবহার 5