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

הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.

לעיון במסמכי התיעוד של Apigee Edge

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

תבנית אנטי

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

  • באותו תהליך או בתהליכים שונים של 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 עבור פרוקסי ה-API הזה ב-30 השניות הראשונות בדפוס הבא:

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

קצת אחר כך, נניח אחרי 32 שניות, מתקבלת הבקשה ה-11 מה-API עם נתיב המשאב /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>.