چگونه با استفاده از برنامه های بدون سرور و در کمتر از 10 دقیقه از وقفه های API Gateway جلوگیری کنیم

چند ماه پیش برای من اتفاق افتاد و مطمئناً برای شما هم اتفاق افتاده است. و این این است که من یک برنامه کاربردی با استفاده از سرور بدون سرور مستقر کرده بودم که، با وجود اینکه تمام روشهای خوب را هنگام توسعه آن رعایت کرده بودم، همیشه مشکلات زمانبندی متناوب برای من ایجاد میکرد. در این مقاله میخواهم به شما بگویم که چگونه مشکلم را حل کردم و این سردرد را تنها با استفاده از 3 سرویس AWS و مقدار زیادی قهوه به یک API کاملاً کاربردی تبدیل کردم.
من فکر میکنم برای چند نفر از ما گاهی اتفاق افتاده است که چیزی خلق میکنیم که کاملاً درست کار نمیکند. در ابتدا، زمانی که تصمیم گرفتم چالش ایجاد یک برنامه بدون سرور را آغاز کنم، تشخیص توابع مورد نیاز برای ایجاد و خدماتی که بهترین تناسب با آنچه را که ایجاد می کردم برایم دشوار بود. اما در نهایت، ایدهای پیدا کردم که امروز میخواهم با شما به اشتراک بگذارم و از خدمات زیر استفاده میکند:
-
AWS API Gateway که مانند یک نگهبان است که دسترسی به سرویسها یا سیستمهای مختلف را تسهیل و کنترل میکند و اطمینان میدهد که ارتباطات آسانتر و ایمنتر است. در مورد ما API ما.
-
AWS Lambda یک سرویس محاسباتی بدون سرور است که کد را در پاسخ به رویدادها بدون نیاز به مدیریت زیرساخت های زیربنایی اجرا می کند.
-
AWS Step Functions سرویسی است که به شما امکان می دهد به صورت بصری و مقیاس پذیر مراحل و اقدامات مختلف یک گردش کار را هماهنگ و هماهنگ کنید و ایجاد و مدیریت برنامه ها و فرآیندهای پیچیده را آسان می کند.
در مورد من، برنامهای که با آن کار میکردم قبلاً از معماری بدون سرور استفاده میکرد، فقط دامنه راهحل فقط بر روی یک دروازه API با ادغام توابع Lambda متمرکز بود. این رویکرد معمولاً تا زمانی که لامبداهای خود را محدود به یک عملکرد خاص نگه دارید، بسیار خوب کار می کند. اما اینجا قسمت “پیچیده” است که تشخیص آن برای بسیاری از ما دشوار است. توابع ما چقدر باید کد داشته باشند؟
من با چندین تابع لامبدا با کد بیش از حد روبرو شدم ، یعنی برای به دست آوردن نتیجه مورد انتظار ، کارهای کوچک زیادی انجام شد ، چندین مورد از آنها به دنبال اطلاعات از سرویس های شخص ثالث به دنبال آن رفتند (یعنی کارها یکی پس از دیگری ) که باعث شد زمان پردازش از آسمان عبور کند و به تبع آن خطاهای تایم اوت مختلف رخ دهد.
اجرای اصلی
نمودار «اجرای اولیه» را اضافه کنید تا نشان دهید چگونه کد یکی از لامبداهای معیوب تقسیم شده است.
- متوجه شدم که این تابع 5 کار را به صورت متوالی اجرا می کند
- زمان انجام هر یک از این وظایف به طور متناوب متفاوت بود.
- وظایف 2 و 4 تماس هایی با سرویس های خارجی داشتند و به صورت همزمان اجرا می شدند، یعنی منتظر می ماندند تا نتیجه تکمیل شود تا بتوانند به اجرای بقیه کد ادامه دهند.
- مجموع تمام نقاط پایانی بیش از 30 ثانیه پیکربندی شده در API Gateway است.
با کمی عمیقتر کردن یاد گرفتم که هنگام صحبت در مورد مهلت زمانی، مهم است که محدودیتهای سرویسهایمان و وابستگیهای آنها را در نظر داشته باشیم.
برای مثال لامبدا محدودیت 15 دقیقه را کنترل می کند، به این معنی که یک تابع لامبدا پس از اجرای آن مدت زمان به طور خودکار متوقف می شود.
محدودیت API Gateway به طور پیشفرض 30 ثانیه است، با این حال میتوانید آن را مطابق با نیاز خود تنظیم کنید (و این را در جایی بنویسید که در کنار پست خود آن را با رمز عبور کامپیوتر به خاطر بسپارید) اما هیچکس نمیخواهد بیش از 30 ثانیه صبر کند. برای دریافت پاسخ، این مانند کامپیوترهایی است که شما را رها می کنند.
راه حل:
ما میخواهیم سرویس سوم خود را روی میز بیاوریم، سرویسی که نجات من شد ☀️، AWS Step Functions، همانطور که قبلاً اشاره کردم این یک سرویس ارکستراتور است، به این معنی که به ما اجازه میدهد فرآیندهای خود را مطابق با آن طراحی و اجرا کنیم. نیازهای ما بیایید این ایده را تجزیه کنیم:
پیاده سازی جدید
در نمودار “پیاده سازی جدید”، من همان وظایفی را که در لامبدای اصلی خود داشتم انجام دادم و آن را تقسیم کردم. هر بخش از Lambda اصلی را به چند لامبدا جدا کنید و ارزیابی کنید که کدام یک می توانند به صورت موازی اجرا شوند و کدام یک به نتایج قبلی بستگی دارد. بدون تغییر منطقی، فقط کد را جدا کنید.
این تغییر نشاندهنده کاهش زمان پاسخ به کمتر از نصف بود، در حالت واقعی، بیشتر کاهش یافت، زیرا من همچنین کد را بازسازی کردم و اقدامات خوبی را در توسعه لامبدا اعمال کردم، مانند: به دست آوردن مقادیر ذخیره پارامترها و اطلاعات DynamoDB خارج از کنترلر، تغییرات کوچکی که تفاوت بزرگی ایجاد کرد. در حالت واقعی 64 درصد از زمان اولیه کاهش یافت. 🙂
حال برای اینکه بتوانید این راه حل را تکرار کنید نیاز دارید:
- یک حساب AWS: یک حساب کاربری جدید ایجاد کنید
- یک محیط توسعه در Cloud9، برای این مثال میتوانید از یک نمونه جدید EC2 از نوع t2.micro استفاده کنید (این موردی است که در ردیف رایگان aws موجود است 😉)
بیا شروع کنیم!
مرحله 1: در محیط Cloud9 مخزن را با دستور زیر شبیه سازی کنید:
$ git clone https://github.com/hsaenzG/APITimeoutsFix.git
پس از این، من قبلاً کد مورد نیاز خود را در محیط دارم:
مرحله 2: در این تمرین من یک الگوی SAM ایجاد می کنم تا تمام زیرساخت های مورد نیاز خود را مستقر کند، این بدان معنا نیست که نمی توانم همه چیز را به صورت دستی مستقیماً از کنسول ایجاد کنم، اما برای سهولت تمرین در این مورد زیرساخت خود را با دستورات زیر مستقر خواهم کرد. :
cd APITimeoutsFix
$ sam build
نتیجه به این شکل است:
اکنون زیرساخت را مستقر می کنم، برای آن دستور زیر را اجرا می کنم
$ sam deploy
این دستور موارد زیر را در حساب AWS نمایش می دهد:
- Api Gateway با یک ادغام Lambda، این مثالی است که من کد اصلی را پیدا کردم و اگر این نقطه پایانی را اجرا کنید، خواهید دید که خطای timeout را برمی گرداند.
- Api Gateway با ادغام با توابع مرحله ای، این نقطه پایانی وظیفه اجرای ماشین گام را بر عهده دارد که چندین لامبدا را به صورت موازی اجرا می کند تا همان نتیجه API اول را به دست آورد، اما بدون خطای عملکرد.
- یک ماشین حالت با پیکربندی جریان لازم برای به دست آوردن تمام اطلاعات مورد نیاز از حماسه هری پاتر:
- پنج تابع لامبدا با مشخصات زیر:
- LambdaIntegration/app.mjs → در این تابع منطق اصلی است
- stepFunctionIntegration/spells.mjs ← این تابع حاوی منطق لازم برای فراخوانی نقطه پایانی است که فقط لیستی از طلسم ها را از حماسه هری پاتر برمی گرداند.
- stepFunctionIntegration/libros.mjs ← این تابع حاوی منطق لازم برای فراخوانی نقطه پایانی است که فقط فهرست کتاب های حماسه هری پاتر را برمی گرداند.
- stepFunctionIntegration/characters.mjs ← این تابع حاوی منطق لازم برای فراخوانی نقطه پایانی است که فقط لیست شخصیت های حماسه هری پاتر را برمی گرداند.
- stepFunctionIntegration/info.mjs ← این تابع حاوی منطق لازم برای فراخوانی نقطه پایانی است که کل لیست طلسم ها، کتاب ها، شخصیت ها و اطلاعات کلی از حماسه هری پاتر را برمی گرداند.
نکات مهمی که می توانید در این مثال ها رعایت کنید:
- ادغام دروازه API با توابع مرحله به صورت همزمان اجرا می شود، به این معنی که API منتظر می ماند تا ماشین حالت اجرای خود را به پایان برساند تا پاسخ را برگرداند، اگر به این شکل پیکربندی نشود، پاسخ نقطه پایانی حاوی نتیجه مورد نیاز نخواهد بود. زیرا ماشین گام به طور مستقل از نقطه پایانی دروازه API اجرا خواهد شد.
- برای این مورد استفاده من از نوع گردش کار Express در دستگاه حالت خود استفاده کردم زیرا این نوع گردش کار برای پشتیبان برنامه های تلفن همراه ایده آل است و در مورد من به عنوان بخشی از باطن یک برنامه وب استفاده می شود، بنابراین من کاملاً کار می کند. ، اما می توانید آن را برای موارد استفاده دیگر مانند:
- بارهای کاری پردازش رویداد با حجم بالا مانند داده های Iot
- پردازش جریانی، تبدیل و پردازش داده ها.
- توجه به این نکته ضروری است که زمان اجرای این نوع ماشین حالت حداکثر 5 دقیقه است.
- سرویس Step Functions در لیست خدمات در ردیف رایگان AWS گنجانده شده است، اما فقط گردشهای کاری استاندارد را پوشش میدهد.
- صورتحساب برای اجرای یک گردش کار سریع بر اساس تعداد اجرا + مدت اجرا + حافظه مصرف شده در طول اجرا است. برای کسب اطلاعات بیشتر در مورد هزینه های استفاده از توابع مرحله می توانید به اینجا بروید: https://aws.amazon.com/es/step-functions/pricing/
آزمایش کردن:
اکنون هر دو نقطه پایانی را آزمایش می کنم تا نتیجه هر یک از آنها را ببینم:
پاسو 1: من نقطه پایانی اصلی را آزمایش خواهم کرد که از postman استفاده خواهم کرد (Postman برنامه ای است که برای آزمایش، مستندسازی و ارسال درخواست ها به API ها استفاده می شود) اما می توانید از ترمینال یا هر برنامه ای که به شما کمک می کند API های خود را آزمایش کنید مانند Insomnia یا Paw استفاده کنید. .
نقطه پایانی API را اجرا کنید: APITimeoutsFix، مسیر API خود را میتوانید در: API Gateway → APITimeOutsFix → Stages → Prod دریافت کنید.
URL درخواست: https:///Prod/LambdaIntegration/
روش درخواست: POST
بدنه: {}
در نتیجه من این خطا را به طور متناوب دریافت می کنم:
این به این دلیل است که از لحاظ داخلی مشکلاتی در زمان اجرا وجود دارد و این فقط نتیجه ای است که انتظار داشتم.
پاسو 2: اکنون راه حل را اجرا می کنم، از postman استفاده می کنم، اما می توانید از ترمینال یا هر برنامه ای که به شما کمک می کند API خود را آزمایش کنید استفاده کنید.
من نقطه پایانی API را اجرا خواهم کرد: WizardingStepFunctionsApi، مسیر API من را می توان در: API Gateway → WizardingStepFunctionsApi → Stages →v2 به دست آورد.
URL درخواست: https:///v2/WizaringWorldParalell
روش درخواست: POST
بدنه: {}
در این حالت پاسخ به صورت زیر تغییر می کند:
در این نقطه پایانی، همیشه می توان نتایج مورد انتظار را به دست آورد. 🙂
پاسو 3: به عنوان یک نکته جالب، اگر می خواهید بدانید که چگونه می توانید اجرای گام به گام دستگاه گام مورد استفاده ما را ببینید، می توانید گزارش را به شرح زیر فعال کنید: به Step Functions → State Machines → IAM Role (کلیک کنید) روی نقش) ← IAM← افزودن مجوزها ← مجوزهای مرتبط ← سیاست CloudWatchFullAccess را اضافه کنید.
سپس به دستگاه حالت برگردید و آن را تغییر دهید، در قسمت ثبت، سطح گزارش را به ALL فعال کنید تا همه چیز را ردیابی کنید.
اکنون هنگامی که نقطه پایانی خود را دوباره اجرا می کنم، جزئیاتی از اجرا در ماشین حالت دریافت می کنم:
و وقتی برای دیدن جزئیات وارد می شوم، می توانم گزارش دقیق کل اجرا را ببینم:
این ویژگی است که من شخصاً آن را بسیار دوست دارم و زمانی که ماشین حالت در حال توسعه و آزمایش است بسیار کمک می کند، زیرا به ما کمک می کند جزئیات ورودی ها و خروجی های دریافتی خود را ببینیم.
خوب، اکنون میخواهم حساب AWS را پاکسازی کنم تا هیچ هزینهای برای آن متحمل نشم، به Cloud9 برمیگردم و دستور زیر را اجرا میکنم:
$ sam delete
با این کار تمام زیرساخت هایی که در این مقاله استفاده شده است حذف می شود.
این یکی از راههایی است که از طریق آن میتوانید مشکلات زمانبندی را در برنامههای بدون سرور خود حل کنید، این تنها راه نیست، اما در مورد من به طرز شگفتانگیزی کار میکند، زیرا اگرچه من همه تماسهای APIهای خارجی را حذف نکردم یا کد را کاهش ندادم، اما قادر به تفکیک گردش کار به روشی کارآمد، تشخیص اینکه کدام کارها هیچ وابستگی بین آنها ندارند و می توانند به صورت موازی اجرا شوند، علاوه بر این، من توانستم توابع اتمی را ایجاد کنم که اکنون یک هدف واحد دارند و می توانم از آنها در هر گردش کار دیگری استفاده کنم. جایی که می توانم به آن نیاز داشته باشم، که به رشد برنامه من به روشی تمیزتر و با استفاده مجدد از کد کمک می کند.
از اینکه مقاله را به پایان رساندید متشکریم، لطفاً نظر خود را در زیر نظر دهید و اگر مشکلی در تکرار نسخه نمایشی داشتید. اگر میخواهید در مورد Step Functions و API Gateway بیشتر بدانید، از لینکهای زیر دیدن کنید: