از دهن افتاده: روایت چند روز خطایابیی پر خطای Celery
مثل غذایی که هوسش رو کنی ولی اون موقع نخوریش، مثل کبابی که سرد شده، اگر یک مشکل رو سر وقتش حل نکنی دیگه حل شدنش نمیچسبه.
امروز بعد از روزها آزمون و خطا، انگولک کردن پارامترهای هر دو طرف، سورس و داکیومنت رو بررسی کردن و کلی نظریهپردازی، مشکل integration بین celery و SQS رو حل کردیم. هدف چی بود؟ خیلی ساده اما اساسی: تسکهایی که failed میشند بعد از retry کردن به تعداد لازم و failed شدن، میرفتند توی DLQ. کار بدیهی که اما انجام نمیشد.
اول فرض رو بر این گذاشتیم که شاید به این خاطر که سلری اساسا برای بروکرهای مبتنی بر AMPQ طراحی شده، برای همین با SQS درست مچ نیست. ولی هرچی سرچ میکردیم کسی این مشکل رو نداشت. از طرفی چندان منطقی بهنظر نمیرسید. SQS یه ابزار شناس و پر استفادهست و همینطور سلری. نمیشد که اینطور باشه. همهی اینها برای من یک معنا بیشتر نداشت: ما خرابکاری داریم میکنیم.
سعی کردم دوبار یه پروژهی کوچیک بیارم بالا برای تست SQS و سلری. اول خیال کردیم که این ستاپ داره درست کار میکنه، پس مشکل از سرویس ما بود. وقتی با هزار جنگولکبازی تونستم کاری کنم که پیام بعد از به اکسپشن خوردن بره توی DLQ، میدیدم پیامهایی که فیلد نشدند هم به DLQ روانه میشند. انگار سلری همیشه داشت ACK میداد به SQS. پس چرا کانفیگهای یکسان دارند نتیجهی متفاوت میدند؟!
بعد از دو روز به مفروضمون شک کردم. شکی که دلم نمیخواست به واقعیت بپیونده که البته پیوست. این مشکل برای هر دو طرف وجود داشت. عملا دستمون خالی شد. مارو لخت آفتابه به گردن وسط شهر ول کردن.
شروع کردیم به دیباگ کردن سلری و خوندن سورسش. گشتیم و break point ها زیر و روی هم تلنبار شدند. تا این که لای این نقطههای قرمز چشممون به جمال نامبارک یک شرط روشن شد:
if task.acks_on_timeout_or_failure
و خسته نباشید! یهو یادمون اومد که د آخه قربون شکلت، تو رو که توی داکیومنت گفته بود!! و من حتی اون اول دیده بودمش. ولی اینقدر به راه و بیراهه زدیم که اصلا توجه من رو به خودش جلب نکرد. اون روز که داک رو رو بررسی میکردم فکر نمیکردم اینقدر به همهی درهای بسته بخوریم و این پارامتر اینقدر مربوطه به مشکل ما.
در نهایت یک آرگومان به تسکها دادیم و تمام. همهچیز درست کار میکرد. بجز این، در این حین فهمیدیم که این هم مهمه که مقدار visibility timeout چی ست بشن. گاهی تا سلری یک پیام رو ACK کنه به خاطر لانگ رانینگ بودن تسک یا هرچیزی، اینقدر طولانی میشد که اگر visibility timeout رو کم میذاشتیم، دوباره یکی از وورکرها برش میداشت و بنا به تعداد ریترایهایی که روی SQS تعریف شده، خودش قبل از تکمیل پردازشش میرفت توی DLQ چون هیچکدوم از وورکرها acknowledgeش نکردن.
به هر حال درست شد ولی اینقدر لت و پار بودم که هیچ نچسبید. بعد از چند روز تلاش واسه گاز گرفتن دممون، دیگه مهم نبود راه حل ساده بود یا پیجیده. دیگه درست بودنش جالب نبود. با تمام این داستانا دو نقطهی عطف توی این ماجرا وجود داره: اول همین سرو کله زدن، کلی دانش نصف و نیمه رو بهش سر و شکل داد و چیز جدید دستگیرمون شد و این کمتر شبیه یک وقت تلفی پرهزینه و طولانیش میکرد و هم این که شب برای یه سری همکارا پاستا درست کردم که خوششون اومد. شاید چون گشنه بودیم ولی واقعا چسبید.
داشتم فکر میکردم که چرا به آشپزی میگن هنر؟ آشپزی در معنای عام و از نظر کاری که عموماً میکنیم بیشتر دقت و مهارت رعایت دستورالعمل و مهندسیه. دیگه برنج و تن ماهی و زیتون رو شما بزک کنی، اسمش هر هنری هست، هنر آشپزی (!) نیست.
پینوشت: اگر غلط تو جملهها هست یا گنگه ببخشید. با چشم نیمهباز داشتم تایپ میکردم.

I'd love to hear from you! Send me your feedback or comments via email.
reply by email