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

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

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

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

תבנית אנטי

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

  • באותו תהליך או בתהליכים שונים של proxy ל-API
  • בנקודות קצה שונות של יעד ב-API proxy

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

הדוגמה הבאה מסבירה איך זה עובד.

proxy ל-API

נניח שיש לנו פרוקסי של 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 הכול
# Requests 4 6 10

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

אנחנו מצפים שהבקשה תעבור בהצלחה בהנחה שעדיין יש לנו 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>

      מדיניות מכסת השימוש לנקודת הקצה של היעד 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>.