מדיניות של SpikeArst

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

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

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

רכיב <SpikeArrest>

הגדרת המדיניות בנושא מניעת עלייה חדה בתנועה.

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

לרכיב הזה יש את המאפיינים הבאים, המשותפים לכל כללי המדיניות:

מאפיין ברירת מחדל חובה? תיאור
name לא רלוונטי נדרש

השם הפנימי של המדיניות. הערך של המאפיין name יכול להכיל אותיות, מספרים, רווחים, מקפים, קווים תחתונים ונקודות. האורך המקסימלי של הערך הוא 255 תווים.

אפשר להשתמש ברכיב <DisplayName> כדי להוסיף תווית למדיניות בכלי לעריכת שרת proxy של ממשק המשתמש לניהול, ולהשתמש בשם אחר בשפה טבעית.

continueOnError false אופציונלי צריך להגדיר את הערך 'False' כדי להחזיר שגיאה כשהמדיניות נכשלת. זו התנהגות צפויה ברוב סוגי המדיניות. הערך של הפרמטר הוא TRUE כדי שביצוע הפעולות יתבצע גם אחרי שמדיניות תיכשל.
enabled true אופציונלי כדי לאכוף את המדיניות צריך להגדיר את הערך True. מגדירים את המדיניות כ-"false" כדי "להשבית" את המדיניות. המדיניות הזו לא תיאכף גם אם היא תצורף לתהליך.
async   false הוצא משימוש המאפיין הזה הוצא משימוש.

דוגמאות

בדוגמאות הבאות מפורטות כמה מהדרכים שבהן אפשר להשתמש במדיניות 'מניעת עלייה חדה בתנועה':

דוגמה 1

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

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

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

דוגמה 2

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

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

הקצב בפועל הוא 300 פריטים לדקה, כלומר אסימון חדש מתווסף לקטגוריה כל 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

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

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

תחביר

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

דוגמה 1

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

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

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

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

הרכיב הזה מתואר גם בפוסט הבא בקהילה של Apigee: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<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 אלפיות שנייה (1000/5).

דוגמה 2

בדוגמה הבאה מוגדר הקצב ל-12 בקשות לדקה:

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

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

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

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

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

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

לדוגמה:

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

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

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

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

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

<UseEffectiveCount>

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

תחביר

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

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

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

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

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

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

בטבלה הבאה מוצגת ההשפעה של <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).

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

הפניה לשגיאה

בקטע הזה מתוארים קודי התקלה והודעות השגיאה שהוחזרו ומשתני התקלה שהוגדרו על ידי Edge כשהמדיניות הזו גורמת לשגיאה. חשוב לדעת את המידע הזה אם אתם מפתחים כללי כשל כדי לטפל בתקלות. מידע נוסף זמין במאמר הבא: מה עלייך לדעת מידע על שגיאות שקשורות למדיניות וטיפול פגמים.

שגיאות זמן ריצה

השגיאות האלה עשויות להתרחש כשהמדיניות מופעלת.

קוד תקלה סטטוס HTTP סיבה תיקון
policies.ratelimit.FailedToResolveSpikeArrestRate 500 השגיאה הזו מתקבלת אם ההפניה למשתנה שמכיל את הגדרת התעריף בתוך האלמנט <Rate> לא ניתן לקבוע ערך בתוך הרכיב Spike Arrest המדיניות בנושא הרכיב הזה הוא חובה ומשמש לציון שיעור השהיות השיא ב- בפורמט intpm או intps.
policies.ratelimit.InvalidMessageWeight 500 השגיאה הזו מתקבלת אם הערך שצוין לרכיב <MessageWeight> באמצעות משתנה זרימה אינו חוקי (ערך שאינו מספר שלם).
policies.ratelimit.SpikeArrestViolation 429

חריגה ממגבלת הקצב של יצירת הבקשות.

שגיאות פריסה

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

שם השגיאה סיבה תיקון
InvalidAllowedRate אם שיעור המעצרים של העלייה החדה צוין ברכיב <Rate> של 'מעצר העליונות' המדיניות היא לא מספר שלם, או אם הסיומת של שיעור ההמרה לא כוללת את ps או את pm, הפריסה של שרת ה-proxy ל-API נכשלת.

משתני כשל

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

משתנים איפה דוגמה
fault.name="fault_name" fault_name הוא שם התקלה, כפי שמצוין ב הטבלה שגיאות זמן ריצה למעלה. שם השגיאה הוא החלק האחרון של קוד התקלה. fault.name Matches "SpikeArrestViolation"
ratelimit.policy_name.failed policy_name הוא השם שצוין על ידי המשתמש של המדיניות שגרמה לבעיה. ratelimit.SA-SpikeArrestPolicy.failed = true

דוגמה לתגובת שגיאה

למטה מוצגת דוגמה לתגובת שגיאה:

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

דוגמה לכלל שגוי

למטה מוצגת דוגמה לכלל שגיאה לטיפול בתקלה מסוג SpikeArrestViolation:

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

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