طراحی پشتیبان های جاوا که پس از شکست بهبود می یابند

برنامه های کاربردی وب بیش از هر زمان دیگری به سرویس های مبتنی بر جاوا وابسته هستند. هر درخواستی که از یک مرورگر، برنامه تلفن همراه یا کلاینت API میآید، در نهایت به یک سرویس پشتیبان میرسد که باید سریع و مداوم پاسخ دهد. وقتی ترافیک افزایش مییابد یا وابستگی کاهش مییابد، بسیاری از سرویسهای جاوا به روشهایی شکست میخورند که در ابتدا نامحسوس و بعداً فاجعهبار هستند. دیر رسیدن تبدیل به عقب افتادن می شود. تاخیر تبدیل به یک تایم اوت می شود. زمان انتظار به یک وقفه کامل سرویس تبدیل می شود.
هدف یک وب سرویس قابل اعتماد جلوگیری از هر خطا نیست. هدف واقعی این است که به سرعت از یک شکست بازیابی کنید که کاربران هرگز متوجه آن نشوند. آنچه مهم است بهبودی برازنده است.
چرا سرویس های وب جاوا در بارگذاری شکست می خورند؟
هنگامی که یک وب سرویس جاوا استرس را تجربه می کند، معمولاً در نقاط فشار خاصی از کار می افتد. این خرابی ها به طور ناگهانی ظاهر نمی شوند – آنها به آرامی ایجاد می شوند تا زمانی که سیستم دیگر نتواند پاسخ دهد. چند مثال رایج عبارتند از:
- میخ های ترافیکی که باعث پر شدن حوضچه نخ می شود
- پایگاه داده برای برگرداندن نتایج خیلی طول می کشد
- سرویس راه دور با داده های جزئی پاسخ می دهد که برنامه آماده پردازش نیست
- صف های پیام سریعتر از آن چیزی که سیستم بتواند آنها را مدیریت کند در حال رشد هستند
هنگامی که یک قسمت از سیستم کند می شود، هر لایه بالای آن شروع به ساییدن می کند تا متوقف شود. درخواست ها منتظر موضوعات هستند. رشته ها منتظر تماس های شبکه هستند. تماس های شبکه منتظر وابستگی های دیگر هستند. در نهایت، کل سرویس از حرکت می ایستد.
این نوع خرابی توسط یک باگ ایجاد نمی شود. دلیل آن این است که سیستم هیچ راهی برای محافظت در برابر رفتار کند پایین دست ندارد.
خطای رایج در وب سرویس های مبتنی بر جاوا
بسیاری از سرویس های جاوا فرض می کنند که سیستم های خارجی به درستی رفتار می کنند. آنها فرض می کنند که تماس های شبکه به سرعت باز می گردند. آنها فرض می کنند که منابع سالم باقی می مانند. آنها فرض می کنند که بار در سطوح مورد انتظار باقی می ماند.
وقتی این مفروضات شکست بخورند، سیستم هیچ لایه حفاظتی ندارد. وابستگی آهسته منجر به یک نقطه پایانی کند می شود. نقطه پایانی آهسته باعث تلاش مجدد بیشتر می شود. تکرارهای بیشتر بار را افزایش می دهد و مشکل را بدتر می کند. نتیجه یک شکست آبشاری است که کل برنامه را تحت تأثیر قرار می دهد.
توسعه دهندگان اغلب متوجه می شوند که مشکل واقعی خود شکست نیست. مشکل واقعی این است که این سرویس هیچ طرح شکستی ندارد.
نحوه ساخت پردازش پرس و جو پسند بازیابی
یک وب سرویس باید به سرعت تصمیم بگیرد که آیا می تواند یک درخواست را پردازش کند یا خیر. بهبودی با رفتار قابل پیش بینی آغاز می شود. چندین روش به سرویسهای جاوا کمک میکنند تا در هنگام بارگذاری بالا، ایمن پاسخ دهند:
- از محدودیت های واضح برای تعداد درخواست های فعال استفاده کنید
- زمانی که کار را نمی توان انجام داد، با یک نتیجه بازگشتی مطمئن پاسخ دهید
- هنگامی که سیستم از قبل بیش از حد بارگذاری شده است، از اضافه کردن کار بیشتر به سیستم خودداری کنید
- برای تشخیص علائم اولیه استرس، به طور مداوم زمان واکنش را کنترل کنید
این شیوهها جریان درخواستها را سالم نگه میدارند و از کند شدن سیستم تا توقف جلوگیری میکنند.
از وقفه های زمانی کوتاه و ثابت برای نقاط پایانی وب استفاده کنید
یکی از سریعترین راهها برای بهبود انعطافپذیری، جایگزینی مقادیر طولانی یا مقادیر زمانبندی پیشفرض با مقادیر کوتاه و ثابت است.
یک انتظار کوتاه به سیستم اجازه میدهد تا کارهایی را که بعید به نظر میرسد، رها کند. این از مسدود کردن درخواست ها و مسدود کردن دیگران جلوگیری می کند. سریع شکست خوردن بهتر از طولانی نگه داشتن نخ است. تایم اوتهای قابل پیشبینی نیز منجر به رفتار قابل پیشبینی در طول خاموشی میشود و احتمال خرابیهای آبشاری را کمتر میکند.
از تکرار طوفان هایی که مشکلات را بدتر می کنند، خودداری کنید
وقتی وابستگی به تاخیر می افتد، غریزه طبیعی این است که درخواست را دوباره امتحان کنید. این غریزه زمانی معقول است که شکست ها نادر باشند. در یک برنامه وب که هزاران درخواست در ثانیه می بیند، می تواند طوفانی ایجاد کند.
طوفان تلاش مجدد زمانی رخ می دهد که هر مشتری در همان زمان دوباره تلاش کند. ترافیک اضافی سرویس مشکل ساز را بیش از پیش بارگذاری می کند و هر ثانیه وضعیت را بدتر می کند.
برای جلوگیری از این امر، تلاش های مجدد باید کنترل شده و محدود باشد. آنها باید دارای فاصله مناسب باشند و باید بدانند چه زمانی باید متوقف شوند. یک استراتژی امتحان مجدد ایمن می تواند سیستم را از فروپاشی محافظت کند.
Isolation قدرتمندترین ابزار پشتیبان وب است
ایزوله تضمین می کند که یک جزء کند نمی تواند کل برنامه را از بین ببرد. سرویس های وب مبتنی بر جاوا می توانند از جداسازی به روش های مختلفی استفاده کنند:
- عملیات سریع را از عملیات کند جدا کنید
- از تماس های سیستم های خارجی با مرز محافظت کنید
- کارهایی که می تواند به پیمانکاران خاص متوقف شود
- از استخرهای مختلف برای کارهای پسزمینه در مقابل کارهای مربوط به پرس و جو استفاده کنید
ایزوله کردن پلتفرم را حتی زمانی که یک جزء شروع به مشکل می کند پاسخگو نگه می دارد.
هنگام ساخت برنامه های وب جاوا از همزمانی هوشمندانه استفاده کنید
همزمانی یکی از بزرگترین نقاط قوت جاوا و همچنین یکی از بزرگترین منابع شکست آن است. استفاده صحیح از همزمانی به یک برنامه اجازه می دهد تا به طور همزمان به بسیاری از کاربران بدون بارگذاری بیش از حد سیستم سرویس دهد. بهترین شیوه های کلیدی عبارتند از:
- از استخرهای با اندازه ثابت به جای نخ های نامحدود استفاده کنید
- از انجام عملیات طولانی مدت در استخرهای پیمانکار خودداری کنید
- در صورت عملی از عملیات غیر مسدود کننده استفاده کنید
- اطمینان حاصل کنید که وظایف مهم از منابع محروم نمی شوند
همزمانی باید ابزاری برای ثبات باشد، نه منبعی برای غیرقابل پیش بینی بودن.
الگوهایی که Java Web Backends را تحت فشار زنده نگه می دارند
سالها مطالعه اختلالات و رویدادهای بازیابی الگوهایی را نشان میدهد که به طور مداوم تابآوری را بهبود میبخشند:
- محدودیت های واضحی را برای استفاده از منابع تعیین کنید
- ورودی ها را زودتر تایید کنید
- کار طولانی را از بین ببرید و در صورت لزوم سریع شکست بخورید
- از پیام های خطای قابل پیش بینی استفاده کنید
- وقتی سیستم به حد خود رسید، پذیرش کار جدید را متوقف کنید
- کارهای گیر کرده را مرتباً تمیز کنید
- در صورت لزوم قطعات را مجدداً راه اندازی مجدد کنید
این شیوههای کوچک باعث پیشرفت قابل توجهی در دسترسی میشوند.
نظرات نهایی برای توسعه دهندگان وب و مهندسین بک اند
برنامه های کاربردی وب مدرن به ندرت از کار می افتند زیرا یک جزء منفرد از کار می افتد. آنها شکست می خورند زیرا سیستم برای بازیابی آماده نیست. یک سرویس قابل اعتماد مبتنی بر جاوا نیازی به کامل بودن ندارد – باید در صورت بروز خرابی قابل پیش بینی و پایدار باشد.
با طراحی برای بازیابی، به جای تکیه بر شرایط عالی، توسعه دهندگان می توانند سرویس های وب جاوا را بسازند که حتی در شرایط سخت، پایدار، پاسخگو و قابل اعتماد باقی بمانند. این طرز فکر پایه و اساس قابلیت اطمینان طولانی مدت در دنیایی است که فشار هرگز متوقف نمی شود.



