লারাভেলে ধাপে ধাপে কীভাবে সারি থামানো এবং নিয়ন্ত্রণ করা যায়

সর্বশেষ আপডেট: 5 এর ডিসেম্বর 2025
  • লারাভেল একাধিক ড্রাইভার (ডাটাবেস, রেডিস, এসকিউএস…) এবং সংযোগ এবং লজিক্যাল কিউয়ের মধ্যে বিচ্ছেদ সহ একটি ইউনিফাইড কিউ এপিআই অফার করে।
  • জবস ভারী-শুল্ক কাজগুলিকে ব্যাকগ্রাউন্ডে স্থানান্তরিত করার অনুমতি দেয়, সিরিয়ালাইজিং মডেল, মিডলওয়্যার, ওয়ান-অফ জব, এনক্রিপশন, ব্যাচ এবং স্ট্রিংগুলির জন্য সমর্থন সহ।
  • কর্মীদের queue:work, Supervisor এবং queue:pause/queue:continue এর মতো কমান্ড দিয়ে পরিচালিত করা হয়, যা পুনরায় চেষ্টা, সময়সীমা এবং অগ্রাধিকার নিয়ন্ত্রণ করে।
  • ব্যর্থতা, পর্যবেক্ষণ এবং পরীক্ষার জন্য একটি সম্পূর্ণ ইকোসিস্টেম রয়েছে (failed_jobs, queue:retry, queue:monitor, Queue::fake) যা উৎপাদনে কিউগুলিকে নির্ভরযোগ্য করে তোলে।

লারাভেলে সারি ব্যবস্থাপনা

যেকোনো মোটামুটি গুরুত্বপূর্ণ প্রজেক্টে লারাভেলে কিউ (queue) নিয়ে কাজ করা প্রায় বাধ্যতামূলক: ইমেল পাঠানো, CSV ফাইল প্রসেস করা, পিডিএফ তৈরি করা, ছবির আকার পরিবর্তন করা, এক্সটার্নাল এপিআই (API) কল করা… যদি এই সবকিছু মূল HTTP রিকোয়েস্টের মাধ্যমে করা হয়, তাহলে ওয়েবসাইট ধীর হয়ে যায়, 500 এরর (500 error) দেখা দেয়, এবং ব্যবহারকারীকে শেষ পর্যন্ত হতাশ হয়ে একটি ফাঁকা স্ক্রিনের দিকে তাকিয়ে থাকতে হয়।

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

মৌলিক ধারণা: সংযোগ, সারি এবং ড্রাইভার

লারাভেলে, কোনও কিছু থামানোর আগে, আপনাকে এর মধ্যে পার্থক্য বুঝতে হবে সারি সংযোগ এবং সারি নিজেই. ঐন্ config/queue.php তোমার একটা অ্যারে আছে। connections যেখানে আপনি প্রতিটি ব্যাকএন্ড সংজ্ঞায়িত করেন: ডাটাবেস, রেডিস, বিন্সটকডি, স্কোয়ারস, সিঙ্ক, নাল, ফেইলওভার, র‍্যাবিটএমকিউ (যদি আপনি এটি যোগ করেন), ইত্যাদি।

প্রতিটি সংযোগে একাধিক থাকতে পারে লজিক্যাল সারি (নামগুলো যেমন default, emails, high, low, importsবৈশিষ্ট্য queue প্রতিটি সংযোগ নির্দেশ করে যে কোন ডিফল্ট কিউ যেখানে অন্য কোনও নির্দিষ্ট না থাকলে কাজগুলি যাবে। onQueue()এইভাবে আপনি এই ধরনের কাজ করতে পারেন:

  • দ্রুত সারি ইমেল বা ছোট লেনদেনের জন্য।
  • আরেকটি কম অগ্রাধিকার ভিডিও প্রক্রিয়াকরণ বা বড় প্রতিবেদনের মতো দীর্ঘ কাজের জন্য।
  • কাজের ধরণ অনুসারে বিভক্ত সারি: imports, notificaciones, reportesইত্যাদি

যখন আপনি কর্মীটি চালু করবেন php artisan queue:workডিফল্টরূপে, এটি নির্দিষ্ট কিউ শোনে ডিফল্ট নির্বাচিত সংযোগে। যদি আপনি অগ্রাধিকার দিতে চান, তাহলে আপনি একাধিক কমা দ্বারা পৃথক করা সারি পাস করতে পারেন:

php artisan queue:work redis --queue=high,default,low

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

সারিবদ্ধ ড্রাইভার এবং পূর্বশর্ত

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

ড্রাইভার ডাটাবেস

চালক ডাটাবেজ এটি একটি SQL টেবিলে কাজগুলি সংরক্ষণ করে (সাধারণত jobsএটি সেট আপ করা সহজ এবং ছোট প্রকল্প বা উন্নয়ন পরিবেশের জন্য উপযুক্ত যেখানে আপনি Redis বা SQS নিয়ে ঝামেলা করতে চান না।

মৌলিক পদক্ষেপ:

  • মাইগ্রেশন তৈরি করুন: php artisan queue:table (অথবা নতুন সংস্করণে, এটি এইভাবে আসে create_jobs_table ডিফল্ট).
  • মাইগ্রেশন চালান: php artisan migrate.
  • সেট আপ করুন QUEUE_CONNECTION=ডাটাবেস মধ্যে .env এবং নিশ্চিত করুন config/queue.php Que 'default' => env('QUEUE_CONNECTION','database').

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

ড্রাইভার রেডিস

প্রোডাকশনে রেডিস ড্রাইভারই হলো আদর্শ ও নির্ভরযোগ্য টুল। এটি দ্রুত, উন্নত ফিচার (যেমন লকিং, রেট লিমিটিং, অ্যাটমিক লক, হরাইজন ইত্যাদি) সমর্থন করে এবং খুব ভালোভাবে স্কেল করতে পারে।

গুরুত্বপূর্ণ পয়েন্ট:

  • আপনাকে Redis সংযোগটি কনফিগার করতে হবে config/database.php.
  • বিকল্পগুলি serializer y compression রেডিস থেকে তারা সামঞ্জস্যপূর্ণ নয় কিউ ড্রাইভারের সাথে।
  • আপনি ব্যবহার করেন রেডিস ক্লাস্টারসারির নামগুলিতে অবশ্যই একটি হ্যাশ ট্যাগ থাকতে হবে, উদাহরণস্বরূপ {default}যাতে সেই সারির সমস্ত কী একই স্লটে পড়ে।
  • বিকল্প block_for এটি কর্মীকে ক্রমাগত ভোটদানের পরিবর্তে কয়েক সেকেন্ডের জন্য কাজের জন্য অপেক্ষা করার সময় ব্লক করার অনুমতি দেয়: সিপিইউ সংরক্ষণ করে এবং Redis সার্ভারে কোয়েরি কমিয়ে দেয়।

উদাহরণস্বরূপ:

'redis' => ,

যদি তুমি রাখো ব্লক_ফর = 0কোনও চাকরি না পাওয়া পর্যন্ত কর্মী অনির্দিষ্টকালের জন্য অবরুদ্ধ থাকে, যদি আপনি চান যে এটি দ্রুত সংকেতের প্রতি সাড়া দিক, তাহলে এটি মনে রাখা উচিত। SIGTERM অথবা কমান্ড বিরতি দিন।

অন্যান্য ড্রাইভার: SQS, Beanstalkd, null, failover…

ডাটাবেস এবং রেডিস ছাড়াও লারাভেল অন্যান্য সিস্টেম সমর্থন করে :

  • আমাজন SQSAWS-এ পরিচালিত সারি, এর জন্য সমর্থন সহ FIFOবার্তা গোষ্ঠী, ডিডুপ্লিকেশন এবং উন্নত দৃশ্যমানতা সেটিংস। SDK প্রয়োজন। aws/aws-sdk-php.
  • Beanstalkdপ্যাকেজটি ব্যবহার করে খুব দ্রুত এবং সহজে pda/pheanstalk.
  • সিঙ্ক: কাজগুলি সম্পাদন করে অবিলম্বে একই প্রক্রিয়ায়। উন্নয়ন বা পরীক্ষায় কার্যকর, কিন্তু উৎপাদনে এটি কার্যত সারি ব্যবহার না করার মতো।
  • অকার্যকর: "প্রেরণ" করার সাথে সাথে কাজ বাতিল করে দেয়। সারিবদ্ধ সিস্টেম সম্পূর্ণরূপে নিষ্ক্রিয় করতে ব্যবহৃত হয়।
  • ব্যর্থতাএটি আপনাকে একাধিক সংযোগ কনফিগার করতে সাহায্য করে, এবং যদি প্রাথমিক সংযোগটি ব্যর্থ হয়, তাহলে লারাভেল তালিকার পরবর্তী সংযোগে কাজটি ঠেলে দেওয়ার চেষ্টা করে। এমন পরিবেশের জন্য উপযুক্ত যেখানে উচ্চ প্রাপ্যতা গুরুত্বপূর্ণ।
  রুবি বিকাশ: ভাষা, বাস্তুতন্ত্র এবং বর্তমান ব্যবহার

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

চাকরি সৃষ্টি এবং মডেল সিরিয়ালাইজেশন

Un কাজ লারাভেলে, এটি কেবল একটি ক্লাস যা একটি সারিতে সম্পাদন করার জন্য একটি কাজকে ধারণ করে। এটি সাধারণত আর্টিসান দিয়ে তৈরি করা হয় এবং সংরক্ষণ করা হয় app/Jobs.

একটি তৈরি করতে:

php artisan make:job ProcessPodcast

উৎপন্ন শ্রেণী প্রয়োগ ShouldQueue এবং সাধারণত বৈশিষ্ট্য ব্যবহার করে Dispatchable, InteractsWithQueue, Queueable y SerializesModelsহৃদয় পদ্ধতিতে আছে handle()কাজ আসার পর কর্মী যা করে।

এর একটি বিশেষভাবে শক্তিশালী বৈশিষ্ট্য হলো Eloquent মডেলের স্বয়ংক্রিয় সিরিয়ালাইজেশন । আপনি যদি Job কনস্ট্রাক্টরে একটি মডেল গ্রহণ করেন, তাহলে Laravel পুরো অবজেক্টটিকে কিউ-তে যোগ করে না, শুধু এর আইডেন্টিফায়ারটি যোগ করে। যখন জবটি প্রসেস করা হয়, তখন এটি ডাটাবেস থেকে এর রিলেশনশিপগুলো লোড করে মডেলটিকে পুনর্গঠন করে।

সাধারণ উদাহরণ (সিউডোকোডে, যাতে এটি অক্ষরে অক্ষরে পুনরাবৃত্তি না হয়):

  • নির্মাতা গ্রহণ করেন পডকাস্ট $podcast.
  • বৈশিষ্ট্য SerializesModels এটি আইডি সংরক্ষণের জন্য দায়ী।
  • En handle(AudioProcessor $processor) তুমি কঠোর পরিশ্রম করো (উদাহরণস্বরূপ, অডিও প্রক্রিয়াকরণ)।

যদি আপনি চান না যে কোনও মডেলের সম্পর্কগুলি সিরিয়ালাইজ করা হোক (তাই পেলোড বিশাল না হয়), আপনি ব্যবহার করতে পারেন $model->withoutRelations() অথবা পিএইচপি ৮-এ বৈশিষ্ট্যটি # নির্মাতার প্রচারিত সম্পত্তির উপর।

হ্যান্ডেল পদ্ধতিতে নির্ভরতা ইনজেকশন

আরেকটি সুবিধা হ'ল আপনি পারেন হ্যান্ডেল পদ্ধতিতে সরাসরি পরিষেবাগুলি ইনজেক্ট করুন (যেন এটি একটি কন্ট্রোলার), কারণ লারাভেল জবসেও সার্ভিস কন্টেইনার ব্যবহার করে। উদাহরণস্বরূপ, আপনি একটি অনুরোধ করতে পারেন AudioProcessorHTTP ক্লায়েন্ট, রিপোজিটরি ইত্যাদি, এবং ফ্রেমওয়ার্ক তাদের সমাধানের যত্ন নেয়।

যদি আপনার অতি-সূক্ষ্ম নিয়ন্ত্রণের প্রয়োজন হয় যাকে বলা হয় handleআপনি ব্যবহার করতে পারেন Container::bindMethod() কোনও পরিষেবা প্রদানকারীর মধ্যে এবং ইনজেকশন যুক্তি নিজেই সংজ্ঞায়িত করুন, তবে বেশিরভাগ ক্ষেত্রেই জিনিসগুলিকে এত জটিল করার দরকার নেই।

জব মিডলওয়্যার

ঠিক যেমন রুটে মিডলওয়্যার থাকে, জবসেরও থাকতে পারে নির্দিষ্ট মিডলওয়্যার যা কাজের আগে এবং পরে চলে। এটি পদ্ধতিগুলিতে পুনরাবৃত্তিমূলক কোডের সংখ্যা অনেকাংশে হ্রাস করে handle() এবং এটি বিশেষভাবে এর জন্য কার্যকর:

  • হার সীমাবদ্ধতা রেডিসের সাথে।
  • এড়াতে ওভারল্যাপ একই সম্পদের উপর নির্ভরশীল কাজগুলির তালিকা।
  • নিয়মিত ব্যতিক্রম অস্থির API গুলির জন্য।
  • নির্দিষ্ট শর্তে কাজ এড়িয়ে যাওয়া (Skip মিডলওয়্যার)।

মিডলওয়্যার সাধারণত স্থাপন করা হয় app/Jobs/Middleware এবং পদ্ধতি থেকে ফিরে আসে middleware() জব থেকে। ধারণাগত উদাহরণ:

public function middleware(): array { return ;

বিশেষ ধরণের কাজ: অনন্য, এনক্রিপ্ট করা এবং লক করা

লারাভেল আপনাকে নির্দিষ্ট কিছু কাজকে এইভাবে চিহ্নিত করতে দেয় অনন্য একই সময়ে দুটি অভিন্ন উদাহরণ যাতে কখনও সারিবদ্ধ না হয় তা নিশ্চিত করতে। ইন্টারফেস বাস্তবায়নের মাধ্যমে এটি অর্জন করা হয় ShouldBeUnique o ShouldBeUniqueUntilProcessingএবং একটি কী সংজ্ঞায়িত করতে সহায়তা করে uniqueId() এবং একটি সময় uniqueFor.

এটি এই ধরনের জিনিসের জন্য আদর্শ:

  • একটি পণ্যের অনুসন্ধান সূচী পুনরায় গণনা করুন: প্রতি পণ্যে মাত্র একবার এটি শেষ না হওয়া পর্যন্ত
  • একই রিসোর্সের জন্য সমসাময়িক অনুরোধগুলিকে অনুমতি দেয় না এমন বহিরাগত পরিষেবাগুলির সাথে সিঙ্ক্রোনাইজেশন।

নীচে, লারাভেল একটি ব্যবহার করে পারমাণবিক লক ক্যাশের সংখ্যা (রেডিস, মেমক্যাশ, ডাটাবেস, ইত্যাদি)। আপনি সেই লকের জন্য ক্যাশ ড্রাইভারও বেছে নিতে পারেন uniqueVia().

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

বিভিন্ন মোডে কাজ প্রেরণ, বিলম্ব এবং সম্পাদন করুন

একবার আপনার কাজ সংজ্ঞায়িত হয়ে গেলে, আপনি এটি দিয়ে শুরু করবেন Job::dispatch() কন্ট্রোলার, ইভেন্ট লিসেনর, আর্টিসান কমান্ড, এমনকি ক্লোজার থেকে। আপনি যে প্যারামিটারগুলিতে পাস করেন dispatch তারা সরাসরি ইয়োবের নির্মাতার কাছে যায়।

আকর্ষণীয় বৈচিত্র্য:

  • dispatchIf() y dispatchUnless() চালানটি এক লাইনে কন্ডিশন করার জন্য।
  • delay() যাতে নির্দিষ্ট তারিখ/সময় পর্যন্ত কাজটি প্রক্রিয়া করা না যায়।
  • dispatchAfterResponse() o afterResponse() en dispatch() ক্লোজার, যা HTTP প্রতিক্রিয়া পাঠানো না হওয়া পর্যন্ত কার্যকরকরণ স্থগিত রাখে, কিন্তু একই PHP প্রক্রিয়ার মধ্যে।
  • dispatchSync() কাজটি সিঙ্ক্রোনাসভাবে চালানোর জন্য (সারির মধ্য দিয়ে না গিয়ে) কিন্তু একই ক্লাস পুনঃব্যবহার করা।
  • বিশেষ সংযোগ যেমন deferred o background প্রতিক্রিয়ার পরে, একই প্রক্রিয়ায় অথবা একটি নতুন PHP প্রক্রিয়ায় কার্যকর করতে।

অবশেষে, আপনি শৃঙ্খলিত পদ্ধতি ব্যবহার করে সংযোগ এবং সারি নির্দিষ্ট করতে পারেন onConnection() y onQueue(), হয় প্রেরণের সময় অথবা জব বিল্ডারের মধ্যে।

সূক্ষ্ম নিয়ন্ত্রণ: পুনঃপ্রচেষ্টা, ব্যাকঅফ, টাইমআউট এবং ত্রুটি পরিচালনা

লারাভেলে কিউ নিয়ে কাজ করার একটি বড় অংশ হলো, একটি কাজ কতবার পুনরায় চেষ্টা করা হবে , প্রতিটি চেষ্টার মাঝে কতক্ষণ অপেক্ষা করতে হবে এবং কখন সেটিকে ব্যর্থ বলে গণ্য করতে হবে, তা নির্ধারণ করা।

  গেম ডেভেলপার ক্যারিয়ার: সম্পূর্ণ নির্দেশিকা

উপলব্ধ বিকল্প:

  • --tries en queue:work সেই কর্মীর সকল কাজের জন্য সর্বোচ্চ সংখ্যক প্রচেষ্টা নির্ধারণ করতে (যদি না চাকরিটি তার নিজস্ব সংজ্ঞা দেয়) $tries o tries()).
  • $tries অথবা একটি পদ্ধতি tries() প্রতি-কাজ নিয়ন্ত্রণের জন্য জব ক্লাসে।
  • retryUntil() বলতে: "এই সময় পর্যন্ত আবার ইচ্ছামত চেষ্টা করো, তারপর ব্যর্থতা।" যদি এটির সাথে মিলে যায় tries, কমান্ড retryUntil.
  • $maxExceptions বারবার অপ্রয়োজনীয় ব্যতিক্রমের কারণে সমস্যাটি হলে কেটে ফেলা।
  • $timeout o --timeout কর্মী চাইল্ড প্রক্রিয়াটি বন্ধ করার আগে একটি জব কত সেকেন্ড চলতে পারে তা নির্দেশ করার জন্য।
  • $failOnTimeout সময় শেষ হয়ে গেলে কাজটি ব্যর্থ হিসেবে চিহ্নিত করতে।
  • $backoff পদ্ধতিটি backoff() পুনরায় চেষ্টা করার মধ্যে কতক্ষণ অপেক্ষা করতে হবে তা নির্ধারণ করতে, এমনকি সূচকীয় মান থাকা সত্ত্বেও।

যদি কোন চাকরিতে ধরা না পড়া ব্যতিক্রম দেখা দেয়, তাহলে লারাভেল... লেজে আবার ছেড়ে দেয় কনফিগার করা প্রচেষ্টা শেষ না হওয়া পর্যন্ত। আপনি এটি ম্যানুয়ালি নিয়ন্ত্রণ করতে পারেন release($segundos) o fail($exception) যখন আপনি ইচ্ছাকৃতভাবে একটি কাজকে ব্যর্থ হিসেবে চিহ্নিত করতে চান।

ব্যর্থ কাজ, ব্যর্থ_কাজ টেবিল এবং ছাঁটাই

যখন একজন চাকরি তার প্রচেষ্টা শেষ করে দেয়, তখন তাকে বিবেচনা করা হয় ব্যর্থ কাজ এবং লারাভেল এটি টেবিলের মধ্যে সন্নিবেশ করায় failed_jobs (অথবা যদি আপনি এটিকে DynamoDB তে এভাবে কনফিগার করেন)। সেই টেবিলে UUID, সংযোগ, সারি, জব পেলোড এবং থ্রো করা ব্যতিক্রম সংরক্ষণ করা হয়।

দরকারী আদেশ:

  • php artisan queue:failed ব্যর্থদের তালিকা তৈরি করতে।
  • php artisan queue:retry <id|all> আবার চেষ্টা করার জন্য।
  • php artisan queue:forget <id> একটি মুছে ফেলার জন্য।
  • php artisan queue:flush সব মুছে ফেলার জন্য (নতুন সংস্করণে ঘন্টার জন্য বিকল্প সহ)।
  • php artisan queue:prune-failed --hours=48 পুরাতন রেকর্ড স্বয়ংক্রিয়ভাবে ছাঁটাই করতে।

জবসে আপনি একটি পদ্ধতি সংজ্ঞায়িত করতে পারেন failed(Throwable $exception) অতিরিক্ত পরিষ্কারের জন্য: ব্যবহারকারীকে অবহিত করুন, আংশিক ক্রিয়াগুলি ফিরিয়ে আনুন, বিশেষায়িত লগ লিখুন, ইত্যাদি। মনে রাখবেন যে কাজের একটি নতুন উদাহরণ কল করার জন্য তৈরি করা হয়েছে failed()অতএব, সম্পত্তির পরিবর্তনের উপর নির্ভর করবেন না handle().

জব ব্যাচিং: জব ব্যাচ এবং স্ট্রিং এর সাথে তাদের একত্রিত করা

যখন আপনাকে শত শত বা হাজার হাজার সম্পর্কিত কাজ চালু করতে হয় (উদাহরণস্বরূপ, খণ্ডে খণ্ডে একটি বিশাল CSV ফাইল ইম্পোর্ট করা, ব্যাচে ফাইল প্রসেস করা, ডেটা পরিষ্কার করা, ইত্যাদি), তখন লারাভেলের ব্যাচ কার্যকারিতা ব্যবহার করার পরামর্শ দেওয়া হয়।

মৌলিক প্রবাহ:

  • টেবিল তৈরি করুন job_batches বিরূদ্ধে php artisan queue:batches-table && php artisan migrate.
  • বৈশিষ্ট্য সহ ব্যাচের অংশ হবে এমন চাকরিগুলি চিহ্নিত করুন। Batchable.
  • ব্যবহার Bus::batch() কলব্যাক সহ এক সেট জবস পাঠাতে then, catch y finally.
  • প্রতিটি কাজের ব্যাচ অ্যাক্সেস করুন $this->batch() এবং এটি বাতিল হয়েছে কিনা তা পরীক্ষা করুন।
  • চলমান ব্যাচে আরও চাকরি যোগ করার সম্ভাবনা $this->batch()->add().

ব্যাচগুলো চেইনের সাথে চমৎকারভাবে সমন্বিত হয় : আপনি একটি ব্যাচের মধ্যে একাধিক চেইন রাখতে পারেন, অথবা একটি বৃহত্তর চেইনের উপাদান হিসেবেও ব্যাচ ব্যবহার করতে পারেন। এটি বিশেষভাবে উপযোগী যখন আপনি চান একাধিক চেইন 'সমান্তরালভাবে' চলুক এবং সবগুলো সম্পন্ন হলে কোনো একটি নির্দিষ্ট প্রক্রিয়া চালু হোক।

কর্মীদের কার্য সম্পাদন, অগ্রাধিকার এবং স্থাপনা

কিউ'র সমস্ত জাদু ঘটে কারণ আপনার আছে এক বা একাধিক কর্মী কমান্ড চালাচ্ছি queue:work (o queue:listen(যদিও পরবর্তীটি কম দক্ষ)। এই প্রক্রিয়াগুলি দীর্ঘমেয়াদী ডেমন যা তাদের নিজ নিজ কিউ শোনে।

এর মূল বিকল্পগুলি queue:work:

  • সংযোগ: php artisan queue:work redis, queue:work databaseইত্যাদি
  • সারি: --queue=high,default,low অগ্রাধিকার দেওয়া।
  • -এগারো: একটি একক কাজ প্রক্রিয়া করে এবং প্রস্থান করে।
  • -সর্বোচ্চ-চাকরি: X কাজগুলি প্রক্রিয়া করে এবং সমাপ্ত করে (পর্যায়ক্রমে কর্মীদের পুনরায় চালু করতে এবং মেমরি খালি করতে)।
  • -সর্বোচ্চ সময়: N সেকেন্ডের জন্য প্রক্রিয়া করে এবং তারপর প্রস্থান করে।
  • – ঘুম: যখন কোনও চাকরি পাওয়া যায় না তখন কয়েক সেকেন্ড অপেক্ষা করা।
  • - খালি থাকলে থামুন: সারি খালি করে এবং পরিষ্কারভাবে বন্ধ করে (ডকার পরিবেশে বা এককালীন কাজের জন্য আদর্শ)।
  • –সময়সীমা শেষ: প্রতিটি কাজের জন্য সেকেন্ডের টাইমআউট, যেমনটি আমরা আগে উল্লেখ করেছি।
  • -force: অ্যাপটি রক্ষণাবেক্ষণ মোডে থাকলেও কাজগুলি প্রক্রিয়া করতে।

যেহেতু এই প্রসেসগুলো দীর্ঘ সময় ধরে চলে, তাই প্রোডাকশনে X সংখ্যক ওয়ার্কার চালু করতে, ক্র্যাশ করলে সেগুলোকে পুনরায় চালু করতে এবং লগ পরিচালনা করতে প্রায় সবসময়ই সুপারভাইজার (লিনাক্সে) এর মতো একটি প্রসেস মনিটর ব্যবহার করা হয়। লারাভেলের জন্য একটি সাধারণ সুপারভাইজার কনফিগারেশন ব্লকে যা যা সংজ্ঞায়িত করা থাকে:

  • হুকুম সঙ্গে সঙ্গে php artisan queue:work ... কংক্রিট
  • সংখ্যা সমান্তরালভাবে কতজন কর্মী চালু করতে হবে তা নির্দেশ করতে।
  • লগ পাথ, ব্যবহারকারী, স্বয়ংক্রিয় পুনঃসূচনা ইত্যাদি।

লারাভেলে সারি থামানো এবং পুনরায় শুরু করা

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

বিরতি: সারি: বিরতি এবং বাধা সংকেত

সাম্প্রতিক সংস্করণগুলিতে, লারাভেল ওয়ার্কারদের এক্সিকিউশন পজ এবং রিজুম করার জন্য নির্দিষ্ট কমান্ড যুক্ত করেছে:

  • php artisan queue:pause: সিস্টেমকে নতুন কাজ নেওয়া বন্ধ করতে বলে, কিন্তু ইতিমধ্যে চলমান কাজগুলি শেষ করতে দেয়।
  • php artisan queue:continue: নতুন কাজ যেখানে শেষ হয়েছিল সেখান থেকে পুনরায় শুরু করে।
  ওপেন সোর্স পাসওয়ার্ড ম্যানেজারগুলির সম্পূর্ণ নির্দেশিকা

এই কমান্ডগুলো লারাভেলের অভ্যন্তরীণ ক্যাশিং মেকানিজমের মাধ্যমে ওয়ার্কারদের কাছে সিগন্যাল পাঠিয়ে কাজ করে । একারণেই, আপনার আসল ক্যাশ কিউ অন্য কিছু হলেও, একটি সঠিকভাবে কনফিগার করা ক্যাশ ড্রাইভার (যেমন memcached, redis, database, file ইত্যাদি) থাকা জরুরি।

গুরুত্বপূর্ণ: কোনো কিউ বা ওয়ার্কারকে পজ করলে, কিউতে আগে থেকে থাকা জবগুলো বাতিল বা মুছে যায় না ; পজ চলাকালীন এটি কেবল কিউ থেকে আরও জব সরানো প্রতিরোধ করে।

ব্যাঘাত এবং কর্মক্ষমতার উপর প্রভাবের জরিপ

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

Queue::withoutInterruptionPolling();

অথবা এমনকি এর স্ট্যাটিক বৈশিষ্ট্যগুলি সামঞ্জস্য করুন Illuminate\Queue\Worker নির্দিষ্ট স্পর্শ নিষ্ক্রিয় করতে ($restartable, $পজযোগ্যতবে, যদি আপনি এটি করেন এবং তারপর ব্যবহার করার চেষ্টা করেন queue:pause o queue:restartশ্রমিকরা তারা জানতে পারবে নাএটি একটি নকশার সিদ্ধান্ত যা সাবধানে বিবেচনা করা উচিত।

সুপারভাইজার বা ডকারের সাহায্যে ম্যানুয়ালি বিরতি দিন

লারাভেলের নিজস্ব কমান্ড ছাড়াও , প্রোডাকশন পরিবেশে প্রসেসগুলোকে প্রায়শই পরোক্ষভাবে "পজ" করা হয়:

  • সুপারভাইজারে প্রোগ্রামটি বন্ধ করা হচ্ছে (supervisorctl stop laravel-worker:*), যা শ্রমিকদের হত্যা করে বা থামিয়ে দেয়।
  • ব্যবহার - খালি থাকলে থামুন কর্মীদের সারিতে থাকা জিনিসগুলি শেষ করতে এবং তারপর বন্ধ করতে দেওয়ার জন্য মোতায়েনের ক্ষেত্রে।
  • ডকারে, কন্টেইনার প্রক্রিয়াটিকে দিয়ে দেওয়া হচ্ছে --stop-when-empty এবং তারপর এটি বন্ধ হয়ে যায়।

সঙ্গে পার্থক্য queue:pause প্রক্রিয়াগুলি সম্পূর্ণরূপে বন্ধ করে দিলে, কর্মীরা পুনরায় চালু না হওয়া পর্যন্ত আপনি কাজ প্রক্রিয়াকরণ বন্ধ করে দেবেন। অভ্যন্তরীণ বিরতি আপনি কমান্ডের জন্য অপেক্ষা করে প্রক্রিয়াগুলি মেমরিতে রাখতে পারেন continueএটি দ্রুত রোল-ব্যাক স্থাপনা বা স্বল্প রক্ষণাবেক্ষণের সময়কালের জন্য কার্যকর।

ডাটাবেস লেনদেন এবং after_commit

একটি সাধারণ ভুল হলো: ডাটাবেস ট্রানজ্যাকশনের মধ্যে জব পাঠানো । আপনি সতর্ক না হলে, কমিট হওয়ার আগেই ওয়ার্কারটি জবটি সম্পাদন করে ফেলতে পারে এবং আপনার প্রত্যাশিত মডেল বা ডেটা তখনও ডাটাবেসে নাও থাকতে পারে।

এই নাচ এড়াতে, আপনার কাছে দুটি বিকল্প আছে:

  • সক্রিয় করা 'after_commit' => true কিউ সংযোগ কনফিগারেশনে। সুতরাং, লেনদেনের মধ্যে প্রেরিত যেকোনো কাজ নিশ্চিত না হওয়া পর্যন্ত অভ্যন্তরীণভাবে স্থগিত করা হয়।
  • প্রতি-কাজ পদ্ধতি ব্যবহার করুন afterCommit() o beforeCommit() প্রেরণের সময়, শুধুমাত্র নির্দিষ্ট চাকরিতে আচরণ জোর করে প্রয়োগ করা।

যদি লেনদেনটি বিপরীত করা হয়, তবে সেই সময়ে প্রেরিত কাজগুলো কিউতে প্রবেশ না করেই বাতিল হয়ে যায় , যা সামঞ্জস্য বজায় রাখার জন্য সাধারণত কাম্য।

পর্যবেক্ষণ, সারি পরিষ্কার এবং পরীক্ষা করা

একবার আপনি কিউগুলো পুরোদমে চালু করে দিলে, শুধু জবগুলো ফেলে দিয়ে ভুলে গেলেই চলবে না; সবকিছু কেমন আচরণ করছে তা আপনার পর্যবেক্ষণ ও পরীক্ষা করা উচিত।

দরকারী টুল এবং কমান্ড:

  • queue:clear একটি নির্দিষ্ট সারি খালি করতে (SQS, Redis, ডাটাবেস)।
  • queue:monitor নির্দিষ্ট সারিতে কাজের সংখ্যা পর্যবেক্ষণ করতে এবং ইভেন্টটি ট্রিগার করতে QueueBusy যদি তারা একটি সীমা অতিক্রম করে।
  • চাকরির ইভেন্ট Como Queue::before, Queue::after, Queue::looping y Queue::failing কাস্টম লজিক (লগ, মেট্রিক্স, রোলব্যাক, ইত্যাদি) সংযুক্ত করতে।
  • পরীক্ষায় জাল ব্যবহার Queue::fake() y Bus::fake() জবস, স্ট্রিং বা ব্যাচগুলি আসলে কার্যকর না করেই পাঠানো হয়েছে কিনা তা যাচাই করার জন্য।

টেস্ট করার সময় আপনি বলতে পারেন, “এই জবটি X বার কিউতে রাখা হয়েছে” , “এই জবগুলো সম্বলিত একটি চেইন এই ক্রমে ডিসপ্যাচ করা হয়েছে” অথবা “কোনো নির্দিষ্ট জব কিউতে রাখা হয়নি”, যা জটিল ফ্লো-এর ক্ষেত্রে অনেক নিরাপত্তা প্রদান করে।

এই পুরো ইকোসিস্টেমের সাথে—রেডিস বা এসকিউএস-এর মতো ড্রাইভার, সু-নকশাকৃত চাকরি, ফাইন-টিউনিংয়ের জন্য মিডলওয়্যার, ব্যাচ, চেইন, পুনরায় চেষ্টা করার কনফিগারেশন, সুপারভাইজার-পরিচালিত কর্মী এবং কমান্ডের মতো queue:pause y queue:continue— লারাভেল আপনাকে ব্যাকগ্রাউন্ড প্রসেসিং মিলিমিটার পর্যন্ত আয়ত্ত করতে দেয়, সাধারণ ইমেল পাঠানো থেকে শুরু করে ফেইলওভার সহ বিতরণকৃত কিউ আর্কিটেকচার পর্যন্ত, যাতে আপনার অ্যাপ্লিকেশনটি HTTP স্তরে দ্রুত সাড়া দিতে পারে যখন ব্যবহারকারীকে ব্লক না করেই নীচে ভারী কাজ করা হচ্ছে।

লারাভেল ফ্রেমওয়ার্ক
সম্পর্কিত নিবন্ধ:
শক্তিশালী লারাভেল ফ্রেমওয়ার্ক