GraphQL Persisted Queries: האצת ה-API שלך בסדר גודל
לעתים קרובות אנו נתקלים במצב: אפליקציית לקוח שולחת שאילתות GraphQL ענקיות (לדוגמה, query { user { posts { comments { author { ... } } } } }) במשקל 10–15 KB. ברשתות סלולריות, זה גורם ל-TTFB של 3–5 שניות. Persisted Queries פותרות זאת באופן קיצוני: במקום גוף השאילתה המלא, הלקוח שולח רק hash מסוג SHA256 (44 בתים). השרת (או ה-CDN) מחזיר תגובה שמורה במטמון. זה מפחית את התעבורה ב-60% ומאפשר מטמון ברמת HTTP. לפי Apollo, APQ הפחית את גודל הבקשה פי 20 עבור קריאות חוזרות.
הניסיון שלנו: במהלך השנים האחרונות יישמנו טכניקה זו ביותר מ-30 פרויקטים. במקרה אחד (אתר מסחר אלקטרוני עם מיליון מוצרים), APQ הפחית את גודל הבקשה מ-8 KB ל-400 בתים, ו-LCP ירד מ-3.2 שניות ל-1.1 שניות. אנו מבטיחים יישום נקי ללא פשרות אבטחה.
כיצד פועלות Automatic Persisted Queries (APQ)
APQ הוא פרוטוקול דו-שלבי. הלקוח שולח תחילה בקשת POST עם ה-hash בלבד. אם מטמון השרת אינו מכיל את השאילתה, הוא מחזיר 404. לאחר מכן הלקוח שולח שוב עם גוף השאילתה המלא. השרת שומר את צמד ה-hash→שאילתה ומחזיר נתונים. כל הקריאות הבאות הן רק ה-hash, וניתן לעבור לבקשות GET שנשמרות במטמון ב-CDN.
Клиент Сервер CDN/Cache
│ │ │ │
POST {hash} │ │ │
───────────────>│ │ │
404 Not Found │ │ │
<───────────────│ │ │
│ │ │ │
POST {hash + query body} │ │
───────────────>│ │ │
{data} [сохранить hash→query] │ │
<───────────────│ │ │
│ │ │ │
GET ?hash=... │ │ │
──────────────────────────────> │
{data} из кеша │ │
<────────────────────────────── │
השוואה: APQ לעומת Registered PQ לעומת ללא PQ
| קריטריון | ללא Persisted Queries | APQ | Registered PQ |
|---|---|---|---|
| גודל בקשה | מלא (עד 15 KB) | Hash (44 בתים) + מדי פעם מלא | רק hash |
| מטמון CDN | רק אם idempotent | בקשות GET נשמרות במטמון | בקשות GET נשמרות במטמון |
| אבטחה | כל שאילתה | כל שאילתה לאחר רישום | רק שאילתות רשומות |
| מאמץ יישום | — | נמוך (1–2 ימים) | בינוני (3–5 ימים) |
אופטימיזציה של שאילתות GraphQL עם Persisted Queries משפרת את ביצועי ה-API ומשפרת את Core Web Vitals.
הזמינו יישום Persisted Queries — נראה לכם מדדים לפני ואחרי על סביבת בדיקה.
למה להשתמש ב-Registered Persisted Queries?
Registered Persisted Queries (RPQ) הם APQ + רשימת היתרים. בסביבת ייצור, רק שאילתות שה-hash שלהן מופיע במניפסט מותרות. זה מונע התקפות דרך Клиент Сервер CDN/Cache │ │ │ │ POST {hash} │ │ │───────────────>│ │ │ 404 Not Found │ │ │<───────────────│ │ │ │ │ │ POST {hash + query body} │ │───────────────>│ │ │ {data} [сохранить hash→query] │ │<───────────────│ │ │ │ │ │ GET ?hash=... │ │ │──────────────────────────────> │ │ {data} из кеша │ │<────────────────────────────── │ או מוטציות שרירותיות. המניפסט נוצר מקוד הלקוח בזמן בנייה.
# Генерация манифеста из клиентских операций
npx generate-persisted-query-manifest \
--documents "src/**/*.graphql" \
--output persisted-query-manifest.json
// persisted-query-manifest.json (фрагмент)
{
"format": "apollo-persisted-query-manifest",
"version": 1,
"operations": [
{
"id": "dc67510fb4289672bea757e862d6b00e...",
"name": "GetPosts",
"type": "query",
"body": "query GetPosts($limit: Int) { posts(first: $limit) { ... } }"
}
]
}בשרת, אתה רק צריך middleware שמחליף את גוף השאילתה מהמניפסט ודוחה hashes לא ידועים.
מקרה אמיתי: RPQ עבור אפליקציית פינטק
בפרויקט עם דרישות אבטחה גבוהות (עיבוד תשלומים), יישמנו RPQ. יצרנו מניפסט של 120 פעולות והגדרנו בקרה קפדנית. התוצאה: אפס תקלות בשישה חודשים, TTFB ירד ב-40% הודות למטמון GET ב-Cloudflare. חיסכון בעלויות תשתית הסתכם ב-30%.בעיות נפוצות והפתרונות שלהן
| בעיה | פתרון |
|---|---|
| מטמון מיושן בעת שינוי סכמה | השתמש ב-Redis עם TTL של 24 שעות ובטל לפי גרסת סכמה |
| חוסר תמיכה ב-APQ בספרייה | יישם middleware: בדוק JSON נכנס עבור __schema |
| יצירת מניפסט איטית ב-CI | בנייה מצטברת: שמור מניפסט קודם ועדכן רק קבצים ששונו |
כיצד אנו מיישמים Persisted Queries: שלב אחר שלב
- ביקורת על ה-GraphQL API הנוכחי: נתח גדלי בקשות, תדירות כפילויות, מטמון קיים.
- תכנון: בחר גישה (APQ או RPQ), הגדר TTL, הגדר Redis למטמון מבוזר.
- יישום לקוח: שלב
# Генерация манифеста из клиентских операций npx generate-persisted-query-manifest \ --documents "src/**/*.graphql" \ --output persisted-query-manifest.jsonב-Apollo Client או מקביל עבור Relay/Urql. - יישום שרת: הפעל APQ (מובנה ב-Apollo Server), הגדר מטמון, הוסף middleware עבור RPQ אם נדרש.
- בדיקות: ודא נכונות מטמון, עקוב אחר שיעורי פגיעה.
- פריסה ו-CDN: הגדר Nginx למטמון GET, הפעל Cloudflare או Vercel Edge.
מה כלול
- תיעוד של סכמה ומניפסט.
- הגדרת ניטור מטמון (Prometheus/Grafana).
- הדרכת צוות על תחזוקה ועדכוני מניפסט.
- תמיכה לאחר שחרור למשך שבועיים.
- העברת מאגר קוד ותיעוד.
אנו משתמשים בתצורות מוכחות. דוגמת הגדרת Nginx:
proxy_cache_path /var/cache/nginx/graphql levels=1:2 keys_zone=graphql:10m max_size=100m inactive=1h use_temp_path=off;
location /graphql {
if ($request_method = GET) {
proxy_cache graphql;
proxy_cache_key "$uri$is_args$args";
proxy_cache_valid 200 5m;
proxy_cache_use_stale error timeout updating;
add_header X-Cache-Status $upstream_cache_status;
}
proxy_pass http://api_backend;
} ציר זמן ועלות
הגדרת APQ בסיסית עם Redis ו-CDN — 1 עד 2 ימי עסקים. מחזור מלא עם Registered Persisted Queries, מניפסט וניטור — 3 עד 5 ימים. העלות מחושבת באופן אישי לפי מורכבות הסכמה ומספר הלקוחות.
האץ את ה-GraphQL API שלך — צור קשר להערכת פרויקט. נראה לך מדדים לפני ואחרי על סביבת בדיקה.







