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

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

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

ضد الگو

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

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

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

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

پروکسی API

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

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

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

از آنجایی که سهمیه ترافیک برای هر دو سرور هدف یکسان است، سیاست سهمیه واحدی با نام «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>

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

فرض کنید در الگوی زیر در مجموع 10 درخواست API برای این پروکسی API در 30 ثانیه اول دریافت می کنیم:

مسیر منابع /target-us /target-eu همه
# درخواست ها 4 6 10

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

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

با این حال، در واقعیت، یک Quota violation error دریافت می‌کنیم.

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

تاثیر

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

بهترین تمرین

  • از عناصر <Class> یا <Identifier> استفاده کنید تا اطمینان حاصل کنید که شمارنده های متعدد و منحصر به فرد با تعریف یک خط مشی سهمیه حفظ می شوند. بیایید خط مشی Quota "Quota-Minute-Target-Server" را که در بخش قبل توضیح دادیم با استفاده از header 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" مانند قبل ادامه خواهیم داد.
    • حال فرض کنید اگر header target_id دارای مقدار "US" باشد، درخواست ها به نقطه پایانی هدف "Target-US" هدایت می شوند.
    • به طور مشابه اگر header target_id دارای مقدار "EU" باشد، درخواست ها به نقطه پایانی هدف "Target-EU" هدایت می شوند.
    • بنابراین حتی اگر از یک خط مشی Quota در هر دو نقطه پایانی هدف استفاده کنیم، شمارنده های سهمیه جداگانه بر اساس مقدار <Identifier> نگهداری می شوند.
    • بنابراین، با استفاده از عنصر <Identifier> می توانیم اطمینان حاصل کنیم که هر یک از نقاط پایانی هدف، سهمیه مجاز 10 درخواست را دریافت می کند.
  • برای اطمینان از اینکه همیشه تعداد مجاز درخواست‌های API را دریافت می‌کنید، از خط مشی سهمیه جداگانه در هر یک از جریان‌ها/نقاط پایانی هدف/پراکسی‌های API استفاده کنید. بیایید اکنون به همان مثال مورد استفاده در بخش بالا نگاه کنیم تا ببینیم چگونه می توانیم به سهمیه مجاز 10 درخواست برای هر یک از نقاط پایانی هدف دست یابیم.
    • یک خط مشی سهمیه جداگانه تعریف کنید، هر کدام یکی برای نقاط پایانی هدف "Target-US" و "Target-EU"

      خط مشی سهمیه برای نقطه پایانی هدف "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" استفاده می کنیم، یک شمارنده جداگانه حفظ خواهد شد. این تضمین می کند که ما سهمیه مجاز 10 درخواست API در دقیقه را برای هر یک از نقاط پایانی هدف دریافت می کنیم.
  • از عناصر <Class> یا <Identifier> برای اطمینان از حفظ شمارنده های متعدد و منحصر به فرد استفاده کنید.