یه زمانی فکر میکردم هرچی async/await تو کدم بیشتر باشه، سیستم مثل مووووشک کار میکنه
یعنی کد رو باز میکردی، همهجا async، همهجا await…
با خودم میگفتم: «این دیگه تهشه، این سیستم موشکه.»
بعد سیستم رفت زیر بار…
موشک بوووود ولی همون اول ترکید.
همهچی ظاهراً درست بود.
دیدم CPU داره کارشو میکنه، رم هم داشت نفس میکشید، لاگها هم چیز خاصی نمیگفتن.
ولی response time داشت زیاد میشد، کاربرها غر میزدن، منم داشتم به مانیتور زل میزدم که «مگه async نبود؟»
اونجا بود که فهمیدم async قرار نیست بیاد پیشونیتو ماچ کنه و بگه تو نگران نباش همه چی با من.
درواقع async فقط میگه: «داداش من منتظرم، اون Thread بیصاحبو ول کن بره یه کار دیگه بکنه.»
ولی مشکل از جایی شروع میشه که وسط این asyncهای خوشگیلی موووشگیل،
یه کار CPU-bound بندازی.
یا بدتر…
یه .Result یا .Wait بزنی و بگی: «ستون وایسا کارت دارم.»
اینجاست که Thread Pool میاد بیرون میگه یه لیوان آب به من بده ناموسن
میبینی Threadها یکییکی مفقود الاثر میشن
تمام Requestهای جدید میرسن، میبینن جا نیست، چهار زانو میشینن دم در سرور.
سیستم از بیرون مثل بنز جی کلاس، از تو شاهین اتومات.
بدترین قسمتش چیه؟
هیچ اروری نمیبینی.
نه exception، نه crash، نه هیچی.
فقط کاربره که هر ۵ ثانیه یه بار رفرش میزنه و مرده و زندتو مورد دعای خیر قرار میده.
اونجا بود که فهمیدم async بودن به معنی سریع بودن نیست.
اگر منتظر دیتابیس، شبکه یا دیسکی، async عالیه.
اگر داری CPU رو به خاک میدی، async فقط یه اسم قشنگه روش.
و اگر این دوتا رو قاطی کنی، Thread Pool که دیگه واویلا.
از اون روز به بعد، قبل از اینکه async بنویسم، از خودم میپرسم:
الان واقعاً منتظرم؟
یا فقط دارم خودمو گول میزنم؟
خیلی وقتا مشکل performance این نیست که کدت بده.
مشکل اینه که فکر میکنی async یعنی «همه چی حل شد».
نه.
درواقع async ابزار حرفهایه،
ولی اگه نفهمی چی دستته، خیلی سریع تبدیل میشه به سلاح کشتار جمعی.
Post #578
365