ব্যবহারকারী 1599237 থেকে উত্তরের নীতিগুলির উপর ভিত্তি করে , যেখানে আপনি ক্রোন জবগুলি সমস্ত দৃষ্টান্তে চালিত করতে পারেন তবে তার পরিবর্তে চাকরির শুরুতে নির্ধারিত হয় যে তাদের চালানোর অনুমতি দেওয়া উচিত কিনা, আমি আর একটি সমাধান করেছি।
চলমান দৃষ্টান্তগুলি না দেখে (এবং আপনার এডাব্লুএস কী এবং গোপনীয়তা সংরক্ষণ করার জন্য) আমি মাইএসকিউএল ডাটাবেসটি ব্যবহার করছি যা আমি ইতিমধ্যে সমস্ত দৃষ্টান্ত থেকে সংযোগ করছি ing
এটির কোনও ডাউনসাইড নেই, কেবল ইতিবাচক:
- কোন অতিরিক্ত উদাহরণ বা ব্যয়
- রক সলিড সলিউশন - ডাবল এক্সিকিউশন হওয়ার কোনও সম্ভাবনা নেই
- স্কেলযোগ্য - স্বয়ংক্রিয়ভাবে আপনার উদাহরণগুলি নীচে এবং নীচে স্কেল করা হিসাবে কাজ করে
- ফেলওভার - কোনও উদাহরণের ব্যর্থতার ক্ষেত্রে স্বয়ংক্রিয়ভাবে কাজ করে
বিকল্পভাবে, আপনি একটি ডাটাবেসের পরিবর্তে একটি সাধারণভাবে ভাগ করা ফাইল সিস্টেম ( এনডুএস প্রোটোকলের মাধ্যমে এডাব্লুএস ইএফএসের মতো ) ব্যবহার করতে পারেন।
নিম্নলিখিত সমাধানটি পিএইচপি ফ্রেমওয়ার্কের মধ্যে তৈরি করা হয়েছে Yii তবে আপনি সহজেই এটি অন্য ফ্রেমওয়ার্ক এবং ভাষার জন্য মানিয়ে নিতে পারেন। এছাড়াও ব্যতিক্রম হ্যান্ডলারটি Yii::$app->system
আমার নিজস্ব একটি মডিউল। আপনি যা ব্যবহার করছেন তা দিয়ে এটি প্রতিস্থাপন করুন।
public function actionLock() {
$argsAll = $args = func_get_args();
if (!is_numeric($args[0])) {
\Yii::$app->system->error('Duration for obtaining process lock is not numeric.', ['Args' => $argsAll]);
}
if (!$args[1]) {
\Yii::$app->system->error('Job name for obtaining process lock is missing.', ['Args' => $argsAll]);
}
$durationMins = $args[0];
$jobName = $args[1];
$instanceID = null;
unset($args[0], $args[1]);
$command = trim(implode(' ', $args));
if (!$command) {
\Yii::$app->system->error('Command to execute after obtaining process lock is missing.', ['Args' => $argsAll]);
}
if (file_exists('/etc/elasticbeanstalk/.aws-eb-system-initialized')) {
if ($awsEb = file_get_contents('/etc/elasticbeanstalk/.aws-eb-system-initialized')) {
$awsEb = json_decode($awsEb);
if (is_object($awsEb) && $awsEb->instance_id) {
$instanceID = $awsEb->instance_id;
}
}
}
$updateColumns = false;
$affectedRows = \Yii::$app->db->createCommand()->upsert('system_job_locks', [
'job_name' => $jobName,
'locked' => gmdate('Y-m-d H:i:s'),
'duration' => $durationMins,
'source' => $instanceID,
], $updateColumns)->execute();
if ($affectedRows == 0) {
$affectedRows = \Yii::$app->db->createCommand()->update('system_job_locks', [
'locked' => gmdate('Y-m-d H:i:s'),
'duration' => $durationMins,
'source' => $instanceID,
],
'job_name = :jobName AND DATE_ADD(locked, INTERVAL duration MINUTE) < NOW()', ['jobName' => $jobName]
)->execute();
if ($affectedRows == 0) {
exit;
}
}
$command = str_replace('StdOUT', '>', $command);
$command = str_replace('StdERR.ditto', '2>&1', $command);
$command = str_replace('StdERR', '2>', $command);
$command .= ' &';
$output = []; $exitcode = null;
exec($command, $output, $exitcode);
exit($exitcode);
}
এটি আমি ব্যবহার করছি ডেটাবেস স্কিমা:
CREATE TABLE `system_job_locks` (
`job_name` VARCHAR(50) NOT NULL,
`locked` DATETIME NOT NULL COMMENT 'UTC',
`duration` SMALLINT(5) UNSIGNED NOT NULL COMMENT 'Minutes',
`source` VARCHAR(255) NULL DEFAULT NULL,
PRIMARY KEY (`job_name`)
)