الگوی بد: ذخیره کردن پاسخ‌های خطا در حافظه نهان

درحال مشاهده اسناد Apigee Edge هستید.
به اسناد Apigee X بروید.
اطلاعات

ذخیره در حافظه نهان فرایندی است که در آن داده‌ها به‌طور موقت در ناحیه ذخیره‌سازی به نام حافظه نهان برای ارجاع در آینده ذخیره می‌شوند. ذخیره کردن داده‌ها در حافظه نهان مزایای عملکردی قابل‌توجهی دارد زیرا:

  • امکان بازیابی سریع‌تر داده‌ها را فراهم می‌کند
  • با جلوگیری از بازتولید مکرر داده‌ها، زمان پردازش را کاهش می‌دهد
  • از رسیدن درخواست‌های «میانای برنامه‌سازی کاربردی» به سرورهای زیرینه جلوگیری می‌کند و ازاین‌رو سربار سرورهای زیرینه را کاهش می‌دهد
  • بهره‌گیری بهتر از منابع سیستم/برنامه را امکان‌پذیر می‌کند
  • زمان پاسخ میاناهای برنامه‌سازی کاربردی را بهبود می‌بخشد

هرگاه لازم باشد به‌طور مکرر به برخی‌از داده‌هایی که خیلی تغییر نمی‌کنند دسترسی داشته باشیم، قویاً توصیه می‌کنیم از حافظه نهان برای ذخیره این داده‌ها استفاده کنید.

‫Apigee Edge امکان ذخیره کردن داده‌ها در حافظه نهان در زمان اجرا را برای ماندگاری و بازیابی سریع‌تر فراهم می‌کند. ویژگی ذخیره در حافظه نهان ازطریق خط‌مشی PopulateCache، خط‌مشی LookupCache، خط‌مشی InvalidateCache، و خط‌مشی ResponseCache دردسترس قرار می‌گیرد.

در این بخش، بیایید به خط‌مشی «حافظه نهان پاسخ» نگاهی بیندازیم. خط‌مشی «پاسخ نهانه‌سازی» در پلاتفرم Apigee Edge به شما امکان می‌دهد پاسخ‌های سرورهای زیرینه را نهانه‌سازی کنید. اگر برنامه‌های مشتری به‌طور مکرر برای منبع زیرینه یکسانی درخواست ارسال کنند و منبع به‌صورت دوره‌ای به‌روز شود، می‌توانیم این پاسخ‌ها را بااستفاده از این خط‌مشی در حافظه نهان ذخیره کنیم. خط‌مشی «پاسخ حافظه نهان» به برگرداندن پاسخ‌های ذخیره‌شده در حافظه نهان کمک می‌کند و درنتیجه از ارجاع غیرضروری درخواست‌ها به سرورهای زیرینه جلوگیری می‌کند.

خط‌مشی «حافظه نهان پاسخ»:

  • تعداد درخواست‌هایی را که به زیرینه می‌رسد کاهش می‌دهد
  • پهنای باند شبکه را کاهش می‌دهد
  • عملکرد API و زمان‌های پاسخ را بهبود می‌بخشد

الگوی بد

خط‌مشی ResponseCache به شما امکان می‌دهد پاسخ‌های HTTP را با هر «رمز وضعیت» ممکن، به‌طور پیش‌فرض، در حافظه نهان ذخیره کنید. این یعنی پاسخ‌های موفقیت‌آمیز و پاسخ‌های خطا هر دو می‌توانند در حافظه نهان ذخیره شوند.

در اینجا نمونه‌ای از خط‌مشی «ذخیره پاسخ» با پیکربندی پیش‌فرض ارائه شده است:

<!-- /antipatterns/examples/1-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
  <DisplayName>TargetServer ResponseCache</DisplayName>
  <CacheKey>
    <Key Fragment ref="request.uri" /></CacheKey>
    <Scope>Exclusive</Scope>
    <ExpirySettings>
      <TimeoutInSec ref="flow.variable.here">600</TimeoutInSec>
    </ExpirySettings>
  <CacheResource>targetCache</CacheResource>
</ResponseCache>

خط‌مشی «پاسخ نهان‌گاه» پاسخ‌های خطا را در پیکربندی پیش‌فرض خود نهان‌گاه می‌کند. بااین‌حال، ذخیره کردن پاسخ‌های خطا بدون درنظر گرفتن پیامدهای منفی آن توصیه نمی‌شود زیرا:

  • سناریو ۱: خرابی‌ها برای یک دوره موقت و نامشخص رخ می‌دهند و ما ممکن است حتی پس‌از رفع مشکل نیز به‌دلیل ذخیره در حافظه نهان به ارسال پاسخ‌های خطا ادامه دهیم

    یا

  • سناریو ۲: خطاها برای مدت زمان ثابتی مشاهده خواهند شد، سپس باید کد را اصلاح کنیم تا پس‌از رفع مشکل، از ذخیره کردن پاسخ‌ها در حافظه نهان جلوگیری کنیم

بیایید این موضوع را با بررسی دقیق‌تر این دو سناریو توضیح دهیم.

سناریو ۱: خطای موقت زیرینه/منبع

درنظر داشته باشید که خرابی در سرور زیرینه به‌دلیل یکی از دلایل زیر است:

  • مشکل موقت شبکه
  • سرور پشتیبان بسیار شلوغ است و برای مدت موقتی نمی‌تواند به درخواست‌ها پاسخ دهد
  • منبع زیرینه درخواست‌شده ممکن است برای مدت کوتاهی برداشته شود/دردسترس نباشد
  • سرور زیرینه به‌دلیل زمان پردازش بالا برای یک دوره موقت، و غیره به‌کندی پاسخ می‌دهد

در همه این موارد، ممکن است خطاها برای مدت نامعلومی رخ دهند و سپس ممکن است شروع به دریافت پاسخ‌های موفق کنیم. اگر پاسخ‌های خطا را در حافظه نهان ذخیره کنیم، ممکن است حتی پس‌از رفع مشکل سرور پشتیبان، همچنان پاسخ‌های خطا را به کاربران ارسال کنیم.

سناریو ۲: خرابی طولانی‌مدت یا ثابت در زیرساخت/منبع

درنظر بگیرید که می‌دانیم خرابی در زیرینه برای مدت زمان مشخصی است. برای مثال، می‌دانید که یا:

  • منبع زیرینه خاصی به‌مدت ۱ ساعت دردسترس نخواهد بود

    یا

  • سرور زیرینه به‌دلیل خرابی ناگهانی سایت، مشکلات مقیاس‌پذیری، تعمیر و نگهداری، ارتقا، و غیره برداشته شده است/دردسترس نیست.

با این اطلاعات، می‌توانیم زمان انقضای حافظه نهان را به‌طور مناسب در خط‌مشی «حافظه نهان پاسخ» تنظیم کنیم تا پاسخ‌های خطا را برای مدت طولانی‌تری در حافظه نهان ذخیره نکنیم. بااین‌حال، وقتی سرور/منبع زیرینه دوباره دردسترس قرار گرفت، باید خط‌مشی را اصلاح کنیم تا از ذخیره کردن پاسخ‌های خطا در حافظه نهان جلوگیری کنیم. دلیل این است که اگر از سرور زیرینه خطایی موقت/یک‌باره رخ دهد، پاسخ را در حافظه نهان ذخیره می‌کنیم و درنهایت با مشکل توضیح‌داده‌شده در سناریو ۱ بالا مواجه می‌شویم.

تأثیر

  • ذخیره کردن پاسخ‌های خطا در حافظه نهان می‌تواند باعث شود پاسخ‌های خطا حتی پس‌از رفع مشکل در سرور زیرینه ارسال شوند
  • کاربران ممکن است بدون اینکه بدانند علت مشکل ذخیره کردن پاسخ‌های خطا از سرور پشتیبان است، تلاش زیادی برای عیب‌یابی علت مشکل صرف کنند

روال مطلوب

  • پاسخ‌های خطا را در حافظه نهان پاسخ ذخیره نکنید. مطمئن شوید عنصر <ExcludeErrorResponse> در خط‌مشی ResponseCache روی true تنظیم شده باشد تا از ذخیره شدن پاسخ‌های خطا در حافظه نهان جلوگیری شود، همان‌طور که در گزیده کد زیر نشان داده شده است. با این پیکربندی، فقط پاسخ‌های مربوط به کدهای موفقیت پیش‌فرض ۲۰۰ تا ۲۰۵ (مگر اینکه کدهای موفقیت اصلاح شده باشند) در حافظه نهان ذخیره خواهند شد.
    <!-- /antipatterns/examples/1-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
      <DisplayName>TargetServerResponseCache</DisplayName>
      <CacheKey>
        <KeyFragment ref="request.uri" />
      </CacheKey>
      <Scope>Exclusive</Scope>
      <ExpirySettings>
        <TimeoutinSec ref="flow.variable.here">600</TimeoutinSec>
      </ExpirySettings>
      <CacheResource>targetCache</CacheResource>
      <ExcludeErrorResponse>true</ExcludeErrorResponse>
    </ResponseCache>
  • اگر به دلایل خاصی نیاز دارید پاسخ‌های خطا را در حافظه نهان ذخیره کنید، می‌توانید حداکثر/دقیق‌ترین مدت زمانی را که خرابی مشاهده خواهد شد (درصورت امکان) تعیین کنید:
    • «زمان انقضا» را به‌طور مناسب تنظیم کنید تا مطمئن شوید پاسخ‌های خطا را بیشتر از زمانی که خرابی قابل مشاهده است در حافظه نهان ذخیره نمی‌کنید.
    • از خط‌مشی ResponseCache برای ذخیره کردن پاسخ‌های خطا بدون عنصر <ExcludeErrorResponse> استفاده کنید.

    این کار را فقط درصورتی انجام دهید که کاملاً مطمئن باشید خرابی سرور پشتیبان برای یک دوره کوتاه/موقت نیست.

  • ‫Apigee ذخیره کردن پاسخ‌های 5xx از سرورهای زیرینه را توصیه نمی‌کند.