429 בשופיפיי מגיע עם Retry-After ועם דלי בגודל 40 בקשות; ב-WooCommerce המקור הוא בכלל האחסון. איך קוראים את הכותרות ובונים סנכרון שממשיך לעבוד.
עיקרי הדברים
- שופיפיי מפרסמת את המגבלות: דלי של 40 בקשות עם דליפה של 2 בשנייה בתוכנית הרגילה, ופי עשרה מכך ב-Shopify Plus.
- כל תשובת REST מכילה `X-Shopify-Shop-Api-Call-Limit` בפורמט `32/40`, כלומר יש לכם מד דלק בכל בקשה.
- ב-GraphQL המודל שונה לגמרי: תקציב נקודות לשנייה, ושאילתה בודדת אינה יכולה לעלות יותר מ-1,000 נקודות.
- WooCommerce עצמו אינו מגביל את ה-REST API. 429 שמגיע ממנו שייך לשרת, ל-CDN או לתוסף אבטחה.
- סנכרון שנשען על לולאה עם `sleep` קבוע ייכשל ברגע שמישהו אחר יעבוד מול אותה חנות.
429 בשופיפיי הוא מנגנון מתועד: ה-REST Admin API עובד לפי דלי דולף בגודל 40 בקשות לאפליקציה לחנות בתוכניות הרגילות, ותשובת 429 מגיעה עם כותרת Retry-After שאומרת כמה שניות להמתין. ב-WooCommerce המצב הפוך - הליבה אינה מגבילה קצב, ולכן 429 מגיע כמעט תמיד מהאחסון או מ-WAF.
שני מודלים שונים באותה פלטפורמה
שופיפיי מפעילה שתי מערכות מגבלה שונות, ובלבול ביניהן הוא הסיבה הנפוצה ביותר לכך שמפתחים "מתקנים" 429 שממשיך לחזור.
| REST Admin API | GraphQL Admin API | |
|---|---|---|
| היחידה הנמדדת | בקשה | עלות מחושבת בנקודות |
| התקציב בתוכנית הרגילה | דלי של 40 בקשות | 100 נקודות לשנייה |
| קצב ההתאוששות | 2 בקשות בשנייה | מילוי מחדש שוטף לפי restoreRate |
| איפה רואים את המצב | כותרת X-Shopify-Shop-Api-Call-Limit | extensions.cost.throttleStatus בגוף התשובה |
| מה קורה בחריגה | 429 עם Retry-After | השאילתה נחנקת והתקציב מוצג בתשובה |
| תקרה נוספת | אין | שאילתה בודדת עד 1,000 נקודות |
ההבדל המעשי: ב-REST הבקשה היא היחידה, ולכן משיכה של 500 מוצרים אחד-אחד תמצה את הדלי גם אם כל בקשה זעירה. ב-GraphQL העלות נגזרת מכמות השדות והחיבורים שביקשתם, ולכן שאילתה אחת רחבה מדי יכולה לחרוג לבדה.
למה WooCommerce מחזיר 429 אם אין לו הגבלת קצב?
כי ההגבלה אינה באה מ-WooCommerce. חנות WooCommerce רצה על WordPress, שרץ על שרת אינטרנט, שיושב לרוב מאחורי שכבת הגנה. כל אחת מהשכבות האלה יכולה להחזיר 429, ואף אחת מהן אינה מכירה את הלוגיקה של החנות.
- האחסון. כללי הגבלה ברמת Nginx או Apache על נתיבי
wp-jsonועלadmin-ajax.php. - תוסף אבטחה או WAF. חסימות שמופעלות על נתיבים ספציפיים, לעיתים בלי כותרת
Retry-Afterבכלל. - Store API. זו השכבה היחידה שבה WooCommerce כן מתעדת הגבלת קצב משלה - ברירת מחדל של 25 בקשות בחלון של 10 שניות, על בקשות POST בלבד, וכבויה כברירת מחדל. היא מחזירה כותרות
RateLimit-Limit,RateLimit-Remaining,RateLimit-Resetו-RateLimit-Retry-After.
לכן האבחון ב-WooCommerce מתחיל בשאלה אחרת לגמרי: לא "איך מאטים את הסנכרון" אלא "מי החזיר את ה-429". ההבדל נראה בגוף התשובה - שגיאת WordPress מובנית נראית אחרת לחלוטין מדף חסימה של WAF.
איך קוראים את המצב במקום לנחש
- ב-REST של שופיפיי, קראו את
X-Shopify-Shop-Api-Call-Limitבכל תשובה. הערך38/40אומר שנשארו שתי בקשות, ואפשר להאט לפני שנחסמים במקום אחרי. - כשמגיע 429, כבדו את
Retry-Afterכפי שהוא. זה מספר השניות שהפלטפורמה עצמה מבקשת להמתין, והוא מדויק יותר מכל נוסחה שתמציאו. - ב-GraphQL, קראו את
throttleStatusבכל תשובה:maximumAvailable,currentlyAvailableו-restoreRateנותנים תמונת תקציב מלאה. - שמרו את
requestedQueryCostמולactualQueryCost. פער גדול ביניהם אומר שאתם מבקשים דפים גדולים מדי ומקבלים פחות. - ב-WooCommerce, רשמו את קוד הסטטוס יחד עם גוף התשובה הגולמי ועם כל הכותרות. בלי זה אי אפשר להבדיל בין חסימת שרת לבין הגבלה של Store API.
איך בונים סנכרון ששורד 429?
- הפרידו בין איסוף לעיבוד. תהליך אחד מושך ורושם לתור, תהליך אחר צורך מהתור. סנכרון שעושה את שניהם בלולאה אחת נעצר כולו כשמגיע 429.
- תנו לכל פריט בתור מונה ניסיונות וזמן ניסיון הבא.
Retry-Afterנכתב אל תוך זמן הניסיון הבא, לא אל תוךsleepשחוסם את כל התהליך. - עבדו עם עובד יחיד לכל חנות. הדלי בשופיפיי הוא לכל אפליקציה לכל חנות, ולכן שני עובדים מקבילים מתחלקים באותו תקציב ומאיצים את החסימה.
- השתמשו בעימוד מבוסס סמן ושמרו את הסמן. סנכרון שמתחיל מההתחלה אחרי כל כישלון יבזבז את התקציב בדיוק על מה שכבר נמשך.
- עשו את הכתיבות אידמפוטנטיות. אחרי 429 אינכם יודעים אם הבקשה נחסמה לפני העדכון או אחריו, ובלי מפתח ייחודי לכל פעולה תיווצרנה כפילויות.
- תעדו קצב בפועל, לא קצב מתוכנן. מספר הבקשות שיצאו בפועל בדקה הוא המדד היחיד שמאפשר לכוונן.
מה נשבר בפועל
sleepקבוע. עובד לבד, נכשל ברגע שאפליקציה נוספת או משתמש בממשק הניהול צורכים מאותו דלי.- התעלמות מ-
Retry-After. ניסיון חוזר מיידי מאריך את החסימה במקום לקצר אותה. - ריצה מקבילית "כדי לזרז". מכפילה את קצב הצריכה ומגיעה ל-429 מהר יותר, בלי להשלים יותר עבודה.
- שאילתת GraphQL אחת ענקית. נכשלת על תקרת 1,000 הנקודות ולא על התקציב לשנייה, ולכן האטה לא תעזור לה.
- טיפול ב-429 כשגיאה קטלנית. התהליך נופל, מישהו מריץ אותו מחדש מההתחלה, והמעגל נסגר.
- סנכרון של הכול בכל הרצה. משיכה מלאה במקום שינויים מאז חותמת הזמן האחרונה היא הדרך המהירה ביותר למצות תקציב.
אבחון בחמש דקות כשהסנכרון נתקע
- הוציאו מהלוג את קוד הסטטוס המלא ואת כל כותרות התשובה של הבקשה שנכשלה. בלי הכותרות אין אבחון.
- ב-Shopify, בדקו את הערך של
X-Shopify-Shop-Api-Call-Limitבבקשות שקדמו לכישלון. אם הוא כבר היה קרוב לתקרה, מדובר בקצב ולא בבאג. - בדקו אם
Retry-Afterקיים בכלל. קיומו מעיד על מגבלה מוצהרת של הפלטפורמה; היעדרו מרמז על חסימה של שכבת תשתית. - ספרו כמה בקשות יצאו בפועל בדקה שקדמה לכישלון. המספר הזה, ולא הכוונה שבקוד, הוא מה שהפלטפורמה מדדה.
- בדקו מי עוד עובד מול אותה חנות באותו זמן - אפליקציה נוספת, עובד שני, או משתמש שמייצא נתונים מממשק הניהול.
- אם מדובר ב-GraphQL, השוו את
requestedQueryCostל-actualQueryCostבבקשות האחרונות שהצליחו. עלות מבוקשת גבוהה היא סימן לדפים גדולים מדי.
הסדר הזה חשוב, כי ארבעת הצעדים הראשונים מבדילים בין שלוש בעיות שנראות זהות מבחוץ: קצב גבוה מדי, שאילתה יקרה מדי, וחסימה שאינה קשורה כלל לחנות.
קשור: מה זו הגבלת קצב ב-API, Shopify מול WooCommerce, חיבור חנות מקוונת ל-ERP.
מקורות
שאלות נפוצות
כמה בקשות מותרות לי בשופיפיי?
ב-REST Admin API התקציב בתוכניות הרגילות הוא דלי של 40 בקשות לאפליקציה לחנות, שמתמלא בקצב של 2 בקשות בשנייה. ב-Shopify Plus הערכים גדולים פי עשרה. ב-GraphQL המדידה היא בנקודות ולא בבקשות, ולכן המספר תלוי בשאילתה עצמה.
האם שופיפיי מחזירה Retry-After?
כן. תשובת 429 ב-REST Admin API מוחזרת יחד עם כותרת `Retry-After` שמכילה את מספר השניות להמתנה. זה הערך שצריך לכבד, ולא לוח זמנים שקבעתם מראש. ב-GraphQL המידע מגיע במקום זאת בתוך `extensions.cost.throttleStatus`.
קיבלתי 429 מ-WooCommerce. מה לבדוק ראשון?
מי החזיר אותו. ליבת WooCommerce אינה מגבילה את ה-REST API, ולכן בדקו את לוגי שרת האינטרנט, את כללי ה-WAF או ה-CDN, ואת תוספי האבטחה. אם החסימה מגיעה מנתיב checkout, בדקו גם אם הגבלת הקצב של Store API הופעלה.
אפשר להעלות את המגבלה?
בשופיפיי המגבלה נגזרת מרמת התוכנית של החנות ואינה ניתנת לשינוי לכל אפליקציה. ב-WooCommerce, מכיוון שההגבלה מגיעה מהתשתית, ספק האחסון הוא הכתובת. בשני המקרים הקטנת מספר הבקשות עדיפה על ניסיון להרחיב את התקציב.
להמשך קריאה
שירות רלוונטי
מלאי ורכש
מלאי ברמת SKU, כללי הזמנה חוזרת ותהליך אישור מתועד.
על הכותב
יהונתן סעדיה
מפתח פרילנסר לאוטומציה, אתרים ו-MVP
אני יהונתן סעדיה, מפתח בכיר שבונה אוטומציה עסקית, אתרים מותאמים ומוצרי MVP לעסקים קטנים ובינוניים בארה"ב, אירופה וישראל. המדריכים האלה נכתבים מתוך עבודה אמיתית עם לקוחות, לא מתיאוריה.
בוא נעבוד יחדיש לך פרויקט דומה?
ספר לי מה אתה רוצה לבנות או איזה תהליך להפוך לאוטומטי. אני חוזר תוך 24 שעות עסקים עם כמה שאלות ממוקדות, ואז עוברים על זה יחד בשיחת היכרות חינמית של 30 דקות, בלי התחייבות. בסוף יש לך היקף עבודה, לוח זמנים ומחיר קבוע - או תשובה כנה שלא שווה לבנות את זה.
