אנטי-תבנית: שימוש חוזר במדיניות מכסת נפח

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

‫Apigee Edge מאפשר להגדיר את מספר הבקשות המותרות ל-API Proxy לתקופה מסוימת באמצעות מדיניות המכסה.

תבנית אנטי

אם נעשה שימוש חוזר במדיניות מכסה, מונה המכסה יופחת בכל פעם שמדיניות המכסה מופעלת, ללא קשר למקום שבו היא מופעלת. כלומר, אם נעשה שימוש חוזר במדיניות מכסת נפח:

  • באותה זרימה או בזרימות שונות של API Proxy
  • בנקודות קצה שונות של יעד ב-API Proxy

לאחר מכן, מונה המכסה יורד בכל פעם שהיא מופעלת, ובסופו של דבר נקבל שגיאות של חריגה מהמכסה הרבה לפני הזמן שצפוי למרווח הזמן שצוין.

הדוגמה הבאה ממחישה איך זה עובד.

proxy ל-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 Proxy הזה ב-30 השניות הראשונות, בדפוס הבא:

נתיב המשאב /target-us /target-eu הכול
# Requests 4 6 10

קצת אחר כך, אחרי 32 שניות, קיבלנו את בקשת ה-API ה-11 עם נתיב המשאב /target-us.

אנחנו מצפים שהבקשה תעבור בהצלחה בהנחה שעדיין יש לנו 6 בקשות API לנקודת הקצה של היעד target-us בהתאם למכסה המותרת.

אבל בפועל, אנחנו מקבלים Quota violation error.

הסיבה: אנחנו משתמשים באותה מדיניות מכסות בשתי נקודות הקצה של היעד, ולכן מונה מכסות יחיד משמש למעקב אחרי בקשות ה-API שמגיעות לשתי נקודות הקצה של היעד. לכן, אנחנו ממצים את המכסה של 10 בקשות בדקה באופן קולקטיבי ולא עבור נקודת הקצה של היעד הספציפי.

השפעה

הדפוס הזה עלול לגרום לחוסר התאמה בציפיות, ולתחושה שמגבלות המכסה מוצו לפני הזמן.

שיטה מומלצת

  • כדי להגדיר מדיניות מכסות אחת שתאפשר לכם לשמור על כמה מוני נפרדים, אתם יכולים להשתמש ברכיבים <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 Proxy. עכשיו נשתמש באותה דוגמה מהקטע שלמעלה כדי להראות איך אפשר להגיע למכסה המותרת של 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>

      מדיניות המכסה לנקודת הקצה 'יעד-אירופה':

      <!-- /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>.