Antipattern: استفاده مجدد از یک خط مشی سهمیه

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

Apigee Edge امکان پیکربندی تعداد درخواست‌های مجاز برای یک API Proxy را برای یک دوره زمانی خاص با استفاده از سیاست Quota فراهم می‌کند.

ضدالگو

اگر یک سیاست سهمیه‌بندی دوباره استفاده شود، شمارنده سهمیه‌بندی هر بار که سیاست سهمیه‌بندی اجرا می‌شود، صرف نظر از محل استفاده از آن، یک واحد کاهش می‌یابد. به عبارت دیگر، اگر یک سیاست سهمیه‌بندی دوباره استفاده شود:

  • در همان جریان یا جریان‌های مختلف یک پروکسی API
  • در نقاط پایانی هدف مختلف یک پروکسی API

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

بیایید از مثال زیر برای توضیح نحوه‌ی کار این روش استفاده کنیم.

پروکسی API

فرض کنید یک API Proxy با نام «TestTargetServerQuota» داریم که ترافیک را بر اساس مسیر منبع به دو سرور هدف مختلف هدایت می‌کند. و ما می‌خواهیم ترافیک API را برای هر یک از این سرورهای هدف به 10 درخواست در دقیقه محدود کنیم. جدول زیر این سناریو را نشان می‌دهد:

مسیر منابع سرور هدف سهمیه
/target-us target-US.somedomain.com ۱۰ درخواست در دقیقه
/target-eu target-EU.somedomain.com ۱۰ درخواست در دقیقه

سیاست سهمیه‌بندی

از آنجایی که سهمیه ترافیک برای هر دو سرور هدف یکسان است، ما یک سیاست سهمیه‌بندی واحد با نام «Quota-Minute-Target-Server» مطابق شکل زیر تعریف می‌کنیم:

<!-- /antipatterns/examples/1-8.xml -->
<Quota name="Quota-Minute-Target-Server">
  <Interval>1</Interval>
  <TimeUnit>minute</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="10"/>
</Quota>

نقاط پایانی هدف

بیایید از سیاست سهمیه‌بندی «Quota-Minute-Target-Server» در پیش‌جریان نقطه پایانی هدف «Target-US» استفاده کنیم:

<!-- /antipatterns/examples/1-9.xml -->
<TargetEndpoint name="Target-US">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

و از همان سیاست سهمیه‌بندی «Quota-Minute-Target-Server» در پیش‌جریان نقطه پایانی هدف دیگر «Target-EU» نیز استفاده مجدد کنید:

<!-- /antipatterns/examples/1-10.xml -->
<TargetEndpoint name="Target-EU">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  <Response/>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

الگوی ترافیک ورودی

فرض کنید در مجموع ۱۰ درخواست API برای این API Proxy در ۳۰ ثانیه اول طبق الگوی زیر دریافت می‌کنیم:

مسیر منابع /target-us /target-eu همه
# درخواست‌ها ۴ ۶ ۱۰

کمی بعد، یازدهمین درخواست API را با مسیر منبع /target-us دریافت می‌کنیم، فرض کنید بعد از ۳۲ ثانیه.

با فرض اینکه هنوز 6 درخواست API برای نقطه پایانی هدف target-us ، انتظار داریم درخواست با موفقیت انجام شود.

با این حال، در واقعیت، ما با Quota violation error مواجه می‌شویم.

دلیل: از آنجایی که ما از سیاست سهمیه‌بندی یکسانی در هر دو نقطه پایانی هدف استفاده می‌کنیم، از یک شمارنده سهمیه‌بندی واحد برای ردیابی درخواست‌های API که به هر دو نقطه پایانی هدف می‌رسند استفاده می‌شود. بنابراین ما سهمیه ۱۰ درخواست در دقیقه را به صورت جمعی و نه برای یک نقطه پایانی هدف به صورت جداگانه، تمام می‌کنیم.

تأثیر

این ضدالگو می‌تواند منجر به عدم تطابق اساسی انتظارات شود و این تصور را ایجاد کند که محدودیت‌های سهمیه‌بندی زودتر از موعد به پایان رسیده‌اند.

بهترین شیوه

  • از عناصر <Class> یا <Identifier> برای اطمینان از حفظ چندین شمارنده منحصر به فرد با تعریف یک سیاست سهمیه واحد استفاده کنید. بیایید سیاست سهمیه "Quota-Minute-Target-Server" را که در بخش قبلی توضیح دادیم، با استفاده از هدر target_id به عنوان <Identifier> مطابق شکل زیر، دوباره تعریف کنیم:
    <!-- /antipatterns/examples/1-11.xml -->
    <Quota name="Quota-Minute-Target-Server">
      <Interval>1</Interval>
      <TimeUnit>minute</TimeUnit>
      <Allow count="10"/>
      <Identifier ref="request.header.target_id"/>
      <Distributed>true</Distributed>
    </Quota>
    • ما مانند گذشته به استفاده از این سیاست سهمیه‌بندی در هر دو نقطه پایانی هدف «Target-US» و «Target-EU» ادامه خواهیم داد.
    • حال فرض کنید اگر هدر target_id دارای مقدار "US" باشد، درخواست‌ها به نقطه پایانی هدف "Target-US" هدایت می‌شوند.
    • به طور مشابه، اگر هدر target_id دارای مقدار «EU» باشد، درخواست‌ها به نقطه پایانی هدف «Target-EU» هدایت می‌شوند.
    • بنابراین حتی اگر از سیاست سهمیه‌بندی یکسانی در هر دو نقطه پایانی هدف استفاده کنیم، شمارنده‌های سهمیه‌بندی جداگانه‌ای بر اساس مقدار <Identifier> حفظ می‌شوند.
    • بنابراین، با استفاده از عنصر <Identifier> می‌توانیم اطمینان حاصل کنیم که هر یک از نقاط انتهایی هدف، سهمیه مجاز 10 درخواست را دریافت می‌کنند.
  • از سیاست سهمیه‌بندی جداگانه در هر یک از جریان‌ها/نقاط انتهایی هدف/پروکسی‌های API استفاده کنید تا مطمئن شوید که همیشه تعداد مجاز درخواست‌های API را دریافت می‌کنید. حال بیایید به همان مثالی که در بخش بالا استفاده شد نگاهی بیندازیم تا ببینیم چگونه می‌توانیم به سهمیه مجاز ۱۰ درخواست برای هر یک از نقاط انتهایی هدف دست یابیم.
    • یک سیاست سهمیه‌بندی جداگانه تعریف کنید، یکی برای هر یک از نقاط پایانی هدف «هدف-ایالات متحده» و «هدف-اتحادیه اروپا»

      سیاست سهمیه‌بندی برای نقطه پایانی هدف «Target-US»:

      <!-- /antipatterns/examples/1-12.xml -->
      <Quota name="Quota-Minute-Target-Server-US">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>

      سیاست سهمیه‌بندی برای نقطه پایانی هدف «Target-EU»:

      <!-- /antipatterns/examples/1-13.xml -->
      <Quota name="Quota-Minute-Target-Server-EU">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
    • از سیاست سهمیه‌بندی مربوطه در تعریف نقاط پایانی هدف، همانطور که در زیر نشان داده شده است، استفاده کنید:

      نقطه پایانی هدف "Target-US":

      <!-- /antipatterns/examples/1-14.xml -->
      <TargetEndpoint name="Target-US">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-US</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-us.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>

      نقطه پایانی هدف "Target-EU":

      <!-- /antipatterns/examples/1-15.xml -->
      <TargetEndpoint name="Target-EU">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-EU</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-eu.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
    • از آنجایی که ما از سیاست سهمیه‌بندی جداگانه‌ای در نقاط پایانی هدف «Target-US» و «Target-EU» استفاده می‌کنیم، یک شمارنده جداگانه حفظ خواهد شد. این تضمین می‌کند که سهمیه مجاز ۱۰ درخواست API در دقیقه را برای هر یک از نقاط پایانی هدف دریافت می‌کنیم.
  • از عناصر <Class> یا <Identifier> برای اطمینان از حفظ شمارنده‌های متعدد و منحصر به فرد استفاده کنید.