מדיניות של SpikeArst

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

סמל של Spike Arrest בממשק המשתמש של Edge

המדיניות Spike Arrest (מניעת עליות פתאומיות בתנועה) מגנה מפני עליות פתאומיות בתנועה באמצעות הרכיב <Rate>. האלמנט הזה מגביל את מספר הבקשות שמעובדות על ידי שרת proxy של API ונשלחות אל ה-backend, וכך מגן מפני עיכובים בביצועים והשבתה.

רכיב <SpikeArrest>

הגדרה של מדיניות Spike Arrest.

ערך ברירת המחדל מידע נוסף מופיע בכרטיסייה מדיניות ברירת המחדל שבהמשך.
חובה? אופציונלי
סוג אובייקט מורכב
רכיב אב לא רלוונטי
רכיבי צאצא <Identifier>
<MessageWeight>
<Rate> (חובה)
<UseEffectiveCount>

תחביר

רכיב <SpikeArrest> משתמש בתחביר הבא:

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <DisplayName>display_name</DisplayName>
  <Properties/>
  <Identifier ref="flow_variable"/>
  <MessageWeight ref="flow_variable"/>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

מדיניות ברירת המחדל

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

<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1">
  <DisplayName>Spike Arrest-1</DisplayName>
  <Properties/>
  <Identifier ref="request.header.some-header-name"/>
  <MessageWeight ref="request.header.weight"/>
  <Rate>30ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

This element has the following attributes that are common to all policies:

Attribute Default Required? Description
name N/A Required

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

continueOnError false Optional Set to "false" to return an error when a policy fails. This is expected behavior for most policies. Set to "true" to have flow execution continue even after a policy fails.
enabled true Optional Set to "true" to enforce the policy. Set to "false" to "turn off" the policy. The policy will not be enforced even if it remains attached to a flow.
async   false Deprecated This attribute is deprecated.

דוגמאות

בדוגמאות הבאות אפשר לראות כמה מהדרכים שבהן אפשר להשתמש במדיניות Spike Arrest:

דוגמה 1

בדוגמה הבאה, הקצב מוגדר לחמש בקשות בשנייה:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

המדיניות מאפשרת שליחה של בקשה אחת בכל 200 אלפיות השנייה (1,000 חלקי 5).

דוגמה 2

בדוגמה הבאה, הקצב מוגדר ל-300 לדקה:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

הקצב בפועל הוא 300pm, כלומר כל 200 מילישניות נוסף אסימון חדש לקטגוריה. גודל הקטגוריה תמיד מוגדר ל-10% מהערך של messagesPerPeriod. לכן, אם הערך של messagesPerPeriod הוא 300, גודל המאגר הוא 30 טוקנים.

דוגמה 3

בדוגמה הבאה, הבקשות מוגבלות ל-12 בדקה (בקשה אחת מותרת כל חמש שניות, או 60/12):

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

בנוסף, רכיב <MessageWeight> מקבל ערך מותאם אישית (הכותרת weight) שמשנה את המשקלים של ההודעות באפליקציות או בלקוחות ספציפיים. כך מקבלים שליטה נוספת על הגבלת הקצב של ישויות שמזוהות באמצעות הרכיב <Identifier>.

דוגמה 4

בדוגמה הבאה, המדיניות Spike Arrest מורה לחפש ערך של זמן ריצה שהוגדר באמצעות הבקשה, שמועבר כמשתנה של זרימת העבודה request.header.runtime_rate:

<SpikeArrest name="Spike-Arrest-1">
  <Rate ref="request.header.runtime_rate" />
</SpikeArrest>

הערך של משתנה הזרימה צריך להיות בפורמט intpm או intps.

כדי לנסות את הדוגמה הזו, מריצים בקשה כמו הבקשה הבאה:

curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'

הפניה לרכיב צאצא

בקטע הזה מתוארים רכיבי הבן של <SpikeArrest>.

<DisplayName>

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

הרכיב <DisplayName> משותף לכל סוגי המדיניות.

ערך ברירת המחדל לא רלוונטי
חובה? אופציונלי. אם לא מציינים את <DisplayName>, המערכת משתמשת בערך של מאפיין name של המדיניות
סוג מחרוזת
רכיב אב <PolicyElement>
רכיבי צאצא ללא

התחביר של רכיב <DisplayName> הוא:

תחביר

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

דוגמה

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

לרכיב <DisplayName> אין מאפיינים או רכיבי צאצא.

<Identifier>

מאפשרת לבחור איך לקבץ את הבקשות כדי שאפשר יהיה להחיל את המדיניות של Spike Arrest על סמך הלקוח. לדוגמה, אפשר לקבץ בקשות לפי מזהה מפתח. במקרה כזה, הבקשות של כל מפתח ייספרו במסגרת שיעור מניעת העלייה הפתאומית של המפתח עצמו, ולא כל הבקשות לשרת ה-proxy.

אפשר להשתמש בו בשילוב עם הרכיב <MessageWeight> כדי לקבל שליטה מדויקת יותר על הגבלת קצב הבקשות.

אם משאירים את הרכיב <Identifier> ריק, מגבלת קצב אחת נאכפת על כל הבקשות ל-API proxy הזה.

ערך ברירת המחדל לא רלוונטי
חובה? אופציונלי
סוג מחרוזת
רכיב אב <SpikeArrest>
רכיבי צאצא ללא

תחביר

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Identifier ref="flow_variable"/>
</SpikeArrest>
        

דוגמה 1

בדוגמה הבאה, מדיניות Spike Arrest מוחלת לפי מזהה מפתח:

<SpikeArrest name="Spike-Arrest-1">
  <Identifier ref="developer.id"/>
  <Rate>42pm</Rate/>
</SpikeArrest>

בטבלה הבאה מתוארים המאפיינים של <Identifier>:

מאפיין תיאור ברירת מחדל נוכחות
ref מזהה את המשתנה שלפיו מדיניות Spike Arrest מקבצת בקשות נכנסות. אפשר להשתמש בכל משתנה של זרימת נתונים כדי לציין לקוח ייחודי, כמו המשתנים שזמינים עם מדיניות VerifyAPIKey. אפשר גם להגדיר משתנים מותאמים אישית באמצעות מדיניות JavaScript או מדיניות AssignMessage. לא רלוונטי חובה

הנושא הזה מוסבר גם בפוסט הבא בקהילת Apigee: Quota Identifier Across Different Policies.

<MessageWeight>

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

אפשר להשתמש בו בשילוב עם <Identifier> כדי לווסת עוד יותר את הבקשות לפי לקוחות או אפליקציות ספציפיים.

לדוגמה, אם הערך של Spike Arrest <Rate> הוא 10pm, ואפליקציה שולחת בקשות עם משקל של 2, אז מותר לשלוח מהלקוח הזה רק חמש הודעות בדקה, כי כל בקשה נחשבת כ-2.

ערך ברירת המחדל לא רלוונטי
חובה? אופציונלי
סוג מספר שלם
רכיב אב <SpikeArrest>
רכיבי צאצא ללא

תחביר

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <MessageWeight ref="flow_variable"/>
</SpikeArrest>

דוגמה 1

בדוגמה הבאה, הבקשות מוגבלות ל-12 בדקה (בקשה אחת מותרת כל חמש שניות, או 60/12):

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

בדוגמה הזו, <MessageWeight> מקבל ערך מותאם אישית (הכותרת weight בבקשה) שמשנה את המשקלים של ההודעות עבור לקוחות ספציפיים. כך מקבלים שליטה נוספת על הגבלת הקצב של ישויות שמזוהות באמצעות הרכיב <Identifier>.

בטבלה הבאה מתוארים המאפיינים של <MessageWeight>:

מאפיין תיאור נוכחות ברירת מחדל
ref מזהה את משתנה התהליך שמכיל את משקל ההודעה של הלקוח הספציפי. זה יכול להיות כל משתנה של זרימת נתונים, כמו פרמטר של שאילתת HTTP, כותרת או תוכן של גוף ההודעה. מידע נוסף זמין במאמר בנושא משתני זרימה. אפשר גם להגדיר משתנים מותאמים אישית באמצעות מדיניות JavaScript או מדיניות AssignMessage. חובה לא רלוונטי

<Rate>

מציין את הקצב שבו מגבילים עליות חדות בתעבורת נתונים (או פרצי תעבורה) על ידי הגדרת מספר הבקשות שמותרות במרווחי זמן של דקה או שנייה. אפשר גם להשתמש ברכיב הזה בשילוב עם <Identifier> ועם <MessageWeight> כדי להגביל את התנועה בצורה חלקה בזמן הריצה על ידי קבלת ערכים מהלקוח.

ערך ברירת המחדל לא רלוונטי
חובה? חובה
סוג מספר שלם
רכיב אב <SpikeArrest>
רכיבי צאצא ללא

תחביר

אפשר לציין תעריפים באחת מהדרכים הבאות:

  • שיעור סטטי שאתם מציינים כגוף של רכיב <Rate>
  • ערך משתנה, שאפשר להעביר אותו על ידי הלקוח. מציינים את שם משתנה התהליך באמצעות המאפיין ref
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
</SpikeArrest>

ערכי שיעור תקפים (מוגדרים כערך משתנה או בגוף הרכיב) צריכים להיות בפורמט הבא:

  • intps (מספר הבקשות לשנייה, מוחלק למרווחי זמן של אלפיות השנייה)
  • intpm (מספר הבקשות בדקה, מוחלק למרווחי שניות)

הערך של int חייב להיות מספר שלם חיובי שגדול מאפס.

דוגמה 1

בדוגמה הבאה, הקצב מוגדר לחמש בקשות לשנייה:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

המדיניות מאפשרת שליחה של בקשה אחת בכל 200 אלפיות השנייה (1,000 חלקי 5).

דוגמה 2

בדוגמה הבאה, הקצב נקבע ל-12 בקשות בדקה:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

מדיניות הדוגמה הזו מחליקה את הקצב כך שמתאפשרת בקשה אחת בכל חמש שניות (‎60/12).

בטבלה הבאה מתוארים המאפיינים של <Rate>:

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

אפשר גם להשתמש במשתנים מותאמים אישית באמצעות מדיניות JavaScript או מדיניות AssignMessage.

אם מגדירים גם את ref וגם את גוף הרכיב הזה, הערך של ref מוחל וקודם כשהמשתנה של זרימת העבודה מוגדר בבקשה. (ההפך נכון אם המשתנה שצוין ב-ref לא מוגדר בבקשה).

לדוגמה:

<Rate ref="request.header.custom_rate">1pm</Rate>

בדוגמה הזו, אם הלקוח לא מעביר כותרת custom_rate, הקצב של ה-API proxy הוא בקשה אחת לדקה לכל הלקוחות. אם הלקוח מעביר כותרת custom_rate, מגבלת הקצב הופכת ל-10 בקשות לשנייה לכל הלקוחות בשרת ה-proxy – עד לשליחת בקשה ללא הכותרת custom_rate.

אפשר להשתמש ב-<Identifier> כדי לקבץ בקשות ולאכוף תעריפים מותאמים אישית לסוגים שונים של לקוחות.

אם מציינים ערך למאפיין ref אבל לא מגדירים את התעריף בגוף של רכיב <Rate> והלקוח לא מעביר ערך, המדיניות Spike Arrest (מניעת עליות פתאומיות בתנועה) מחזירה שגיאה.

אופציונלי לא רלוונטי

<UseEffectiveCount>

מפיץ את הספירות של Spike Arrest בין מעבדי ההודעות (MP) כשמשתמשים בקבוצות של שינוי גודל אוטומטי.

תחביר

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

דוגמה 1

בדוגמה הבאה, הערך של <UseEffectiveCount> מוגדר כ-true:

<SpikeArrest name='Spike-Arrest-1'>
  <Rate>40ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

הרכיב <UseEffectiveCount> הוא אופציונלי. ערך ברירת המחדל הוא false אם לא מציינים את הרכיב במדיניות Spike Arrest.

ערך ברירת המחדל לא נכון
חובה? אופציונלי
סוג בוליאני
רכיב אב <SpikeArrest>
רכיבי צאצא ללא

בטבלה הבאה מתוארים המאפיינים של רכיב <UseEffectiveCount>:

מאפיין תיאור ברירת מחדל נוכחות
ref מזהה את המשתנה שמכיל את הערך של <UseEffectiveCount>. יכול להיות שזה יהיה משתנה של זרימת נתונים, כמו פרמטר של שאילתת HTTP, כותרת או תוכן של גוף ההודעה. מידע נוסף זמין במאמר Flow variables reference. אפשר גם להגדיר משתנים מותאמים אישית באמצעות מדיניות JavaScript או מדיניות AssignMessage. לא רלוונטי אופציונלי

ההשפעה של <UseEffectiveCount> תלויה בערך שלו:

  • true: מגבלת שיעור העלייה של MP היא <Rate> חלקי המספר הנוכחי של MP באותו פוד. המגבלה המצטברת היא הערך של <Rate>. כשחברי פרלמנט מתווספים (או מוסרים) באופן דינמי, מגבלות הקצב של העלייה החדה שלהם גדלות (או קטנות), אבל המגבלה הכוללת נשארת זהה.
  • false (ברירת מחדל אם לא צוין): מגבלת קצב העלייה של כל MP היא פשוט הערך של <Rate>. המגבלה הכוללת היא סכום השיעורים של כל המודעות המותאמות. כשמוסיפים (או מסירים) חברי פרלמנט, מגבלות הקצב של העלייה החדה של כל אחד מהם יישארו זהות, אבל המגבלה הכוללת תגדל (או תקטן).

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

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

  • שיעורים לדקה מוחלקים לבקשות מלאות שמותרות במרווחי זמן של שניות.

    לדוגמה, אם מגדירים 30pm, המערכת תבצע החלקה באופן הבא:
    60 שניות (דקה אחת) חלקי 30pm = מרווחי זמן של 2 שניות, או בקשה אחת מותרת כל 2 שניות. בקשה שנייה בתוך 2 שניות תיכשל. בנוסף, בקשה 31 בתוך דקה תיכשל.

  • השיעורים לשנייה מוחלקים לבקשות מלאות שמותרות במרווחים של אלפיות השנייה.

    לדוגמה, אם המגבלה היא 10ps, המערכת תבצע החלקה באופן הבא:
    ‫1,000 מילישניות (שנייה אחת) חלקי 10ps = מרווחים של 100 מילישניות, או בקשה אחת מותרת כל 100 מילישניות. בקשה שנייה שנשלחת תוך 100 אלפיות השנייה תיכשל. בנוסף, בקשה 11 בתוך שנייה תיכשל.

בטבלה הבאה מוצגת ההשפעה של <UseEffectiveCount> על המגבלה של הגבלת הקצב של יצירת הבקשות של כל MP:

הערך של <UseEffectiveCount>
false false false true true true
מספר חברי הפרלמנט 8 4 2 8 4 2
הערך של <Rate> 10 10 10 40 40 40
שיעור אפקטיבי לכל מייל 10 10 10 5 10 20
מגבלה מצטברת 80 40 20 ‫40* ‫40* ‫40*
* זהה ל<Rate>.

בדוגמה הזו, שימו לב שכאשר מספר המגה-פיקסלים יורד מ-4 ל-2, והערך של <UseEffectiveCount> הוא false, השיעור האפקטיבי לכל מגה-פיקסל נשאר זהה (10). אבל אם הערך של <UseEffectiveCount> הוא true, הריבית האפקטיבית לכל נקודה משתנה מ-10 ל-20 כשהמספר של הנקודות יורד מ-4 ל-2.

משתני תהליך

כשמדיניות Spike Arrest מופעלת, משתנה הזרימה הבא מאוכלס:

משתנה סוג הרשאה תיאור
ratelimit.policy_name.failed בוליאני הרשאת קריאה בלבד מציין אם המדיניות נכשלה (true או false).

מידע נוסף זמין במאמר בנושא משתני זרימה.

הפניה לשגיאה

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
policies.ratelimit.FailedToResolveSpikeArrestRate 500 This error occurs if the reference to the variable containing the rate setting within the <Rate> element cannot be resolved to a value within the Spike Arrest policy. This element is mandatory and used to specify the spike arrest rate in the form of intpm or intps.
policies.ratelimit.InvalidMessageWeight 500 This error occurs if the value specified for the <MessageWeight> element through a flow variable is invalid (a non-integer value).
policies.ratelimit.SpikeArrestViolation 429

The rate limit was exceeded.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidAllowedRate If the spike arrest rate specified in the <Rate> element of the Spike Arrest Policy is not an integer or if the rate does not have ps or pm as a suffix, then the deployment of the API proxy fails.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "SpikeArrestViolation"
ratelimit.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. ratelimit.SA-SpikeArrestPolicy.failed = true

Example error response

Shown below is an example error response:

{  
   "fault":{  
      "detail":{  
         "errorcode":"policies.ratelimit.SpikeArrestViolation"
      },
      "faultstring":"Spike arrest violation. Allowed rate : 10ps"
   }
}

Example fault rule

Shown below is an example fault rule to handle a SpikeArrestViolation fault:

<FaultRules>
    <FaultRule name="Spike Arrest Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "SpikeArrestViolation") </Condition>
        </Step>
        <Condition>ratelimit.Spike-Arrest-1.failed=true</Condition>
    </FaultRule>
</FaultRules>

קוד הסטטוס הנוכחי של HTTP לחריגה ממגבלת קצב שהוגדרה על ידי מדיניות מכסה או מדיניות למניעת עליות פתאומיות הוא 429 (יותר מדי בקשות). כדי לשנות את קוד הסטטוס של HTTP ל-500 (שגיאה פנימית בשרת), צריך להגדיר את המאפיין features.isHTTPStatusTooManyRequestEnabled ל-false באמצעות ה-API‏ Update organization properties.

לדוגמה:

curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <Properties>
        <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property>
        . . .
    </Properties>
</Organization>"

סכימות

כל סוג מדיניות מוגדר על ידי סכימת XML ‏ (.xsd). סכימות מדיניות זמינות ב-GitHub.

נושאים קשורים