জ্যাঙ্গো সুদূর ভবিষ্যতে কাজগুলি (সম্ভবত) চালায়


9

ধরুন আমার কাছে একটি মডেল আছে Event। ইভেন্টটি শেষ হয়ে যাওয়ার পরে আমি সমস্ত আমন্ত্রিত ব্যবহারকারীদের কাছে একটি বিজ্ঞপ্তি (ইমেল, পুশ, যা কিছু) প্রেরণ করতে চাই। এর লাইন ধরে কিছু:

class Event(models.Model):
    start = models.DateTimeField(...)
    end = models.DateTimeField(...)
    invited = models.ManyToManyField(model=User)

    def onEventElapsed(self):
        for user in self.invited:
           my_notification_backend.sendMessage(target=user, message="Event has elapsed")

এখন, অবশ্যই, গুরুত্বপূর্ণ অংশটি হ'ল onEventElapsedযখনই প্রার্থনা করা timezone.now() >= event.end। মনে রাখবেন, endবর্তমান তারিখ থেকে কয়েক মাস দূরে থাকতে পারে।

আমি এটি করার দুটি প্রাথমিক উপায় সম্পর্কে ভেবেছি:

  1. একটি পর্যায়ক্রমিক cronকাজ (বলুন, প্রতি পাঁচ মিনিট বা তার বেশি সময় ধরে) ব্যবহার করুন যা কোন ঘটনাটি পাঁচ মিনিটের মধ্যে শেষ হয়েছে এবং আমার পদ্ধতিটি কার্যকর করে কিনা তা পরীক্ষা করে।

  2. ভবিষ্যতে (মডেল পদ্ধতির মধ্যে) চালুর জন্য প্যারামিটারটি ব্যবহার করে celeryশিডিয়ুল করুন ।onEventElapsedetasave

বিকল্প 1 বিবেচনা করে, একটি সম্ভাব্য সমাধান হতে পারে django-celery-beat। তবে বিজ্ঞপ্তি প্রেরণের জন্য একটি নির্দিষ্ট ব্যবধানে কোনও কাজ চালানো কিছুটা অদ্ভুত বলে মনে হচ্ছে। তদুপরি আমি একটি (সম্ভাব্য) ইস্যু নিয়ে এসেছি যার ফলস্বরূপ (সম্ভবত) না-যেমন মার্জিত সমাধান হবে:

  • আগের পাঁচ মিনিটের মধ্যে কেটে যাওয়া ইভেন্টগুলির জন্য প্রতি পাঁচ মিনিটে পরীক্ষা করে দেখুন? নড়বড়ে বলে মনে হচ্ছে, কিছু ইভেন্ট মিস হয়ে গেছে (বা অন্যরা তাদের বিজ্ঞপ্তিগুলি দুবার প্রেরণ করে?)। সম্ভাব্য workaroung: Trueএকবার বিজ্ঞপ্তি প্রেরণের পরে সেট করা মডেলটিতে একটি বুলিয়ান ক্ষেত্র যুক্ত করুন ।

তারপরে আবার বিকল্প 2 এরও সমস্যা রয়েছে:

  • কোনও ইভেন্ট শুরু / শেষ তারিখের সময়টি সরানো হলে ম্যানুয়ালি পরিস্থিতিটির যত্ন নিন। ব্যবহার করার সময় celery, একজনকে taskID(সহজ, অফ) সংরক্ষণ করতে হবে এবং তারিখগুলি পরিবর্তিত হয়ে নতুন কাজটি জারি করার পরে টাস্কটি প্রত্যাহার করতে হবে। তবে আমি পড়েছি, ভবিষ্যতে যে কাজগুলি পরিচালনা করা হয় সেগুলি পরিচালনা করার সময় সেই সেলারিটির (নকশা-নির্দিষ্ট) সমস্যা রয়েছে: গিথুব উপর ওপেন ইস্যু । আমি বুঝতে পারি যে এটি কীভাবে ঘটে এবং কেন এটি সমাধান করা তুচ্ছ but

এখন, আমি কয়েকটি লাইব্রেরি নিয়ে এসেছি যা সম্ভবত আমার সমস্যার সমাধান করতে পারে:

  • সেলারি_লংটার্ম_শেজুলার (তবে এর অর্থ কি আমি আগে যেমন সেলারি ব্যবহার করতে পারি না, তেমনি আলাদা তফসিলী শ্রেণীর কারণে? এটিও এর সম্ভাব্য ব্যবহারের সাথে জড়িত django-celery-beat... দুটি ফ্রেমওয়ার্কের মধ্যে কোনওটি ব্যবহার করা কি এখনও চাকরী সারি করা সম্ভব) ( কিছুটা দীর্ঘ সময় চলছে তবে কয়েক মাস দূরে নয়?)
  • জ্যাঙ্গো-অ্যাপসিডুলার , ব্যবহার apscheduler। তবে, এটি কীভাবে সুদূর ভবিষ্যতে পরিচালিত কাজগুলি পরিচালনা করবে সে সম্পর্কে কোনও তথ্য খুঁজে পেতে আমি অক্ষম ছিলাম।

আমি যেভাবে এগিয়ে যাচ্ছি তার সাথে কি কোনও তহবিল সংক্রান্ত ত্রুটি রয়েছে? আপনার যে কোনও ইনপুট থাকতে পারে তার জন্য আমি খুশি।

নোটিশ: আমি জানি এটি সম্ভবত কিছুটা মতামত ভিত্তিক হতে পারে তবে যাইহোক, কিছু খুব কুশল বা মার্জিত হিসাবে বিবেচনা না করেই সম্ভবত আমি খুব মিস করেছি যে আমি মিস করেছি।


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

1
আমার মতে, উত্তর আপনাকে কতটি ইভেন্ট পাঠাতে হবে সে সম্পর্কে about আপনার যদি প্রতিদিন শত শত ইভেন্ট প্রেরণ করা থাকে তবে ভবিষ্যতে একক ঘটনা কতটা দূরে তা বিবেচ্য নয়: প্রথম সমাধানটি (আপনার প্রয়োজনের ভিত্তিতে পুনরাবৃত্তির সময়কে অভিযোজন করে) আপনি আপডেট করা ডেটা পড়ার কাজটি চালাতে পারেন।
ডস

@ হাইডেনএস্টউড এই ব্যক্তিটি অবিলম্বে এটি গ্রহণ করা অত্যন্ত গুরুত্বপূর্ণ নয়, তবে শেষের তারিখের মধ্যে 2-5 মিনিটের মধ্যে ভাল থাকতে হবে। আপনি কি আমার মতামত 1 এর অনুরূপ কিছু করেছেন?
হাফনারনুস

1
@ হাফনারনুস হ্যাঁ - আমি মনে করি যে বার্তা প্রেরণ করা হয়েছে কিনা তা জন্য ডাটাবেসের একটি ক্ষেত্রের সাথে একটি সহজ ক্রোন কল আপনার ক্ষেত্রে উপযুক্ত would
হেডেন ইস্টউড

1
যখন কাজের (যেমন মেমরি কর্মী উপর ক্ষুধার্ত) sheduling এবং আপনার ক্ষেত্রে কাজ করতে পারে, দেখতে সেলারি চেয়ে অন্য aproach ব্যবহার Dramatiq dramatiq.io/guide.html#scheduling-messages । তবে তারা যেমন বলে - বার্তা ব্রোকার ডিবি নয় - যখন আপনাকে দীর্ঘমেয়াদী ইভেন্টের পরিকল্পনার দরকার হয় তখন আপনার প্রথম সমাধানটি আরও ভাল। সুতরাং আপনি উভয়কে একত্রিত করতে পারেন: এমবিতে ইভেন্টগুলি রাখুন, 1 দিনের মধ্যে বলুন, এবং মেয়াদ শেষ হওয়ার সাথে সাথে তারা ডিবিতে যাবে এবং ক্রোন মাধ্যমে পাঠানো হবে।
হিম-nzcr4

উত্তর:


2

আমি যে সংস্থার জন্য কাজ করি আমরা এই জাতীয় কিছু করছি, এবং সমাধানটি বেশ সহজ।

কোনও ক্রোন / সেলারি বীট রয়েছে যা প্রতি ঘন্টা প্রেরণ করে কোনও নোটিফিকেশন প্রেরণ করা দরকার কিনা তা পরীক্ষা করে দেখুন। তারপরে সেই বিজ্ঞপ্তিগুলি প্রেরণ করুন এবং সেগুলি হিসাবে চিহ্নিত করুন। এইভাবে, আপনার বিজ্ঞপ্তির সময় কয়েক বছর এগিয়ে গেলেও এটি প্রেরণ করা হবে। ইটিএ ব্যবহার করা খুব দীর্ঘ সময়ের জন্য অপেক্ষা করার উপায় নয়, আপনার ক্যাশে / এমএএমকিপি হতে পারে ডেটা আলগা করে।

আপনার প্রয়োজনের উপর নির্ভর করে আপনি আপনার বিরতি হ্রাস করতে পারেন তবে নিশ্চিত হন যে সেগুলি ওভারল্যাপ না করে।

যদি এক ঘন্টা সময়ের ব্যবধানের খুব বেশি বিশাল হয় তবে আপনি যা করতে পারেন তা হল, প্রতি ঘন্টা একটি শিডিয়ুলার চালান। যুক্তি কিছু হবে

  1. একটি টাস্ক চালান (যাক এই শিডিয়ুল টাস্কটি কল করুন) প্রতি ঘন্টা যা সমস্ত নোটিফিকেশন পায় যা পরের ঘন্টাটিতে পাঠানো প্রয়োজন (সেলারি বিটের মাধ্যমে) -
  2. প্রয়োগ_অ্যাসিঙ্ক (এটা) এর মাধ্যমে সেই বিজ্ঞপ্তিগুলির সময়সূচী করুন - এটি আসল প্রেরণা হবে

এই পদ্ধতিটি ব্যবহার করে আপনি উভয় সেরা বিশ্বের (এটা এবং বিট) পাবেন


1
ধন্যবাদ. আমি ঠিক তাই করেছি!
হাফনারনুস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.