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

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

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

תבנית אנטי

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

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

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

כדי להסביר איך זה עובד, נשתמש בדוגמה הבאה.

proxy ל-API

נניח שיש לנו proxy ל-API בשם 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 עבור proxy ה-API הזה ב-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 המותר, צריך להשתמש במדיניות מכסות נפרדת בכל אחד מהתהליכים, נקודות הקצה של היעד או שרתי ה-proxy של ה-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>.