چرخه زندگی وظایف
وظایف ناهمزمان در طول چرخه زندگی خود از چند حالت عبور میکنند. این صفحه چرخه حیات یک وظیفه از ایجاد تا حذف را ثبت میکند.
زمانی که یک وظیفه را enqueue میکنید، asynq وظیفه را درونی مدیریت میکند تا اطمینان حاصل شود که handler در زمان مشخص فراخوانی شود. در طول این فرآیند، وظیفه ممکن است از حالتهای مختلف چرخه زندگی عبور کند.
در زیر لیستی از حالتهای مختلف چرخه زندگی آمده است:
-
Scheduled: وظیفه منتظر پردازش در آینده است (فقط منطبق با گزینههای
ProcessAt
یاProcessIn
میباشد). - Pending: وظیفه برای پردازش آماده است و توسط یک کارگر آزاد انتخاب خواهد شد.
- Active: وظیفه توسط یک کارگر در حال پردازش است (به عبارت دیگر، handler در حال پردازش وظیفه است).
- Retry: کارگر قادر به پردازش وظیفه نیست و وظیفه منتظر امتحان مجدد در آینده است.
- Archived: وظیفه به حداکثر تلاشهای امتحان مجدد رسیده است و در آرشیو برای بازبینی دستی ذخیره شده است.
-
Completed: وظیفه با موفقیت پردازش شده است و تا زمان انقضای rentention ذخیره خواهد شد (فقط منطبق با گزینه
Retention
میباشد).
بیایید با یک مثال به حالتهای مختلف چرخه زندگی نگاهی بیندازیم.
// وظیفه ۱: برنامه ریزی برای پردازش در ۲۴ ساعت آینده.
client.Enqueue(task1, asynq.ProcessIn(24*time.Hour))
// وظیفه ۲: Enqueue شده برای پردازش فوری.
client.Enqueue(task2)
// وظیفه ۳: Enqueue شده با گزینه rentention.
client.Enqueue(task3, asynq.Retention(2*time.Hour))
در این مثال، وظیفه ۱
تا زمان انقضای ۲۴ ساعت در حالت Scheduled باقی میماند. پس از گذشت ۲۴ ساعت، به حالت Pending و سپس به Active منتقل خواهد شد. اگر وظیفه با موفقیت پردازش شود، داده وظیفه از Redis حذف خواهد شد. اگر وظیفه به درستی پردازش نشود (به عبارت دیگر، handler یک خطا بازگرداند یا پانیک شود)، وظیفه به حالت Retry برای دفعات بعدی منتقل خواهد شد. پس از گذشت دورهای از زمان، وظیفه به حالت Pending و سپس Active بازمیگردد. این چرخه تا زمانی که وظیفه به درستی پردازش شود یا تلاشهای امتحان مجدد را مصرف کند ادامه خواهد داشت. در آخرین حالت، وظیفه به حالت Archived منتقل خواهد شد.
در این مثال، تنها تفاوت بین وظیفه ۲
و وظیفه ۱
این است که وظیفه ۲
حالت Scheduled را نادیده میگیرد و به طور مستقیم وارد حالت Pending میشود.
وظیفه ۳
با گزینه retention ۲ ساعت Enqueue شده است. این بدان معنی است که پس از موفقیت پردازش توسط یک کارگر، وظیفه برای ۲ ساعت در حالت Completed باقی خواهد ماند و پس از آن از صف حذف خواهد شد. به صورت پیشفرض، اگر یک وظیفه دارای گزینه retention نباشد، فوراً پس از پایان پردازش از صف حذف خواهد شد.
نمودار زیر گذر حالتها را نشان میدهد.
+-------------+ +--------------+ +--------------+ +-------------+
| | | | | | موفقیت | |
| Scheduled |----------->| Pending |--------->| Active |---------> | Completed |
| (اختیاری) | | | | | | (اختیاری) |
+-------------+ +--------------+ +--------------+ +-------------+
^ | |
| | | حذف
| | با شکست مواجه شد |
| | V
| |
| |
+------+-------+ | +--------------+
| | | | |
| Retry |<--------------+------->| Archived |
| | | |
+--------------+ +--------------+