עיצוב וניתוב תנועה
1) מדוע כל זה
עיצוב וניתוב - בסיס של זמינות מנוהלת ואיחור צפוי:- יציבות: אל תתנו ל ”שכנים רועשים” להבקיע ערוצים.
- סדרי עדיפויות ומכסות בין דיירים/כיתות.
- יעילות: אנו שולחים את הבקשה למקום בו היא מעובדת מהר/זול יותר.
- שינוי שליטה: הקנרית/משוקללת משחררת ללא סיכון.
- חיסכון: אופטימיזציה של עלויות יציאה והיטראט CDN-מטמון.
2) מושגים בסיסיים
2. 1 עיצוב תנועה נגד שיטור
מעצב - מיישר את התנועה על ידי חציצה ושליחת מנות בקצב היעד (מחליק ”פיצוצים”).
שיטור - ”מעניש” מופרז (טיפה/סימון) ללא חציצה. קשה יותר, אבל זול יותר.
2. כיתות 2, תורים ודיסציפלינות
תורים עדיפים (Priority Queues), CODEL/RED (Buffer Block Control), ECN (No Drop Congestion Signal).
בתורים L7 - ”תורים” בצורת גבולות RPS/חיבורים/בייטים ובריכות עדיפות.
2. 3 אלגוריתמים מגבילים
Token Bucket (n אסימונים שנוספו בשיעור r; בקשה ”מבלה” k אסימונים).
דליפה באקט (זרם חוץ קבוע; טוב להחליק).
גבולות גלובליים/מקומיים: מקומי - מהיר, גלובלי - הוגן (Redis/etcd/per-derent).
3) QOS לכל L3/L4
3. 1 DSCP/TOS ושיעורי שירות
חבילות תווית לפי סוג התנועה (אינטראקטיבי, backend RPC, עבודות רקע).
במרכזי נתונים, משא ומתן על מדיניות DSCP עם רשת אריג/ענן.
3. 2 לינוקס tc: HTB + fq_codel (ציפורן אגודל)
bash
Clearing tc qdisc del dev eth0 root 2 >/dev/null true
Корневая HTB с 1Gbit tc qdisc add dev eth0 root handle 1: htb default 30 tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
Класс latency-critical 200Mbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 200mbit ceil 1gbit prio 0 tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
Класс background 100Mbit tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 1gbit prio 2 tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel
3. 3 ECN/RED/BBR
ECN מפחית טיפות בפסגות; RED/CoDel מגביל את החציצה.
BBR (במקום Cubic) לעיתים קרובות מפחית p99 latency, במיוחד על גבי תורים כבדים של WAN.
4) ניתוב L7 (HTTP/gRPC/WS)
4. קריטריון ניתוב 1
מסלולים/שיטות ('/api/v1/', 'POST'), כותרות (גרסת לקוח, דגלים, כותרת קנרית), עוגיות (A/B, דביקות), בולי JWT (דייר/תפקיד), Geo/ASN, חלונות זמן, טעינה (זיהוי חוץ).
פרוטוקול: HTTP/2 (multiplexing), HTTP/3/QUIC (התנגדות לאובדן פאק), gRPC (bi-di streams), WebSocket (קשרים ארוכי ימים).
4. 2 פיצול משוקלל/שחרור כנרית
שורש 'v1: 95%', 'v2: 5%', עלייה אוטומטית עם מדדים ”ירוקים”.
חיתוך: שגיאות/latency/business invariants.
שליח (סקיצה)
yaml route:
weighted_clusters:
clusters:
- name: svc-v1 weight: 95
- name: svc-v2 weight: 5
איסטיו
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService spec:
hosts: ["svc"]
http:
- route:
- destination: { host: svc, subset: v1, weight: 95 }
- destination: { host: svc, subset: v2, weight: 5 }
4. 3 פגישות דביקות וחשיש עקבי
זיקה באמצעות זיהוי עוגיות/IP/JWT.
חשיש עקבי עבור אשכולות מטמון, שירותים שארדי, קצב הגבלת שערים.
Nginx
nginx upstream api {
hash $cookie_user_id consistent;
server 10. 0. 0. 1;
server 10. 0. 0. 2;
}
4. ניתוב בעל מודעות גיאולוגית 4
GeoIP/ASN בקצה (CDN/edge).
דגימות בריאות תקופתיות + מדידות RTT = תנועה לאשכול ”המהיר ביותר”.
4. 5 איתור חיצוני/שבירת מעגל
להפיל מקרים ”רעים”: מקסימום פליטה-אחוז, שגיאות בסיסיות/איחור.
מפסק מעגל: מגבלות על חיבורים/RPS/בתורים.
5) תנועה מתעצבת ברמת שער/מחית
5. קצב 1 מגביל
מקומי (לכל תרמיל): זול, אבל לא הוגן בין העתק.
גלובל (Redis/etcd): תוקף לכל דייר/מפתח API.
פוליטיקאים: לכל מסלול, לכל שיטה, לכל דייר, התפוצץ.
שליח RLS (סקיצה)
yaml typed_per_filter_config:
envoy. filters. http. ratelimit:
"@type": type. googleapis. com/envoy. extensions. filters. http. ratelimit. v3. RateLimit domain: "api"
rate_limit_service:
grpc_service: { envoy_grpc: { cluster_name: rate_limit_cluster } }
5. 2 הגינות וסדרי עדיפויות
בריכות עדיפות הן אינטראקטיביות> רקע מערכת>.
DR/WFQ מקביל על L7: מכסות/משקולות ללקוח/דייר.
5. 3 עומס יתר והגנה
מחסן העומס: כישלון/הידרדרות כשהתקציבים מוגזמים.
קונקורנסי אדפטיבי: דינמיקה של גבולות מ-p50/p95/תור לן.
תרמיל גב בצד השרת: 429/503 + Retry-After.
6) רמת eBPF ו ־ CNI
6. 1 Cilium/eBPF
סינון/ניתוב בגרעין: פחות מתגי הקשר, מדיניות L3-L7 דקה.
חשיש מגלב להפצה יציבה.
תוכנות EBPF לקווי QOS (TC/XDP).
6. 2 מדיניות קליקו/NetworkName
מדיניות גישה L3/L4, כיתות עדיפות בסיסיות, אינטגרציה עם Kubernetes QOS (מובטח/Burstable/Butstable/Extreme).
7) שערי קצה/CDN ו ־ API
CDN: מפתחות מטמון (normalization query/headers), מעופש-בזמן-חידוש, הגנה על מקורות (rate limit/bot filters).
שערי API: אימות, מכסות/תוכניות תעריפים (לצרכן), הגבלות SLA, ניתוב גיאו, גרסת API.
סינון בקצה כדי לא לבזבז את המעבד של הליבה.
8) אוטובוסים אסינכרונים/הזרמה
קפקא/NATS/Pulsar: מכסות יצרן/צרכן, מגבלת גודל אצווה, תרמיל גב דרך לג.
ניתוב אירועים: דייר/מפתח אידמפוטנטיות, מחיצות מהבהבות עבור אחידות.
בדיוק פעם אחת ”יעיל פעם אחת”: יצרנים עסקיים + חבורות אידמפוטנטיות.
9) פסקי זמן, נסיגות, גיבוי
פסקי זמן מקצה לקצה: לקוח <proxy <שירות (לא להיפך).
מספר מוגבל עם גיבוי מעריכי מפוקפק אבל ללא סערות.
אידמפוטנטיות היא חובה בנסיגה; אחרת - סאגה/פיצוי.
בקשות מגודרות/מקבילות (זהירות): משפרות את p99, מגבירות את התנועה הכוללת.
10) יכולת תצפית ו ־ SLO
10. 1 מדדים
, , , , .
10. 2 איתור
סרוק קורלציה-זיהוי; הסימן משתרע עם הטיפוס: ”נסה לשפוך את תור המצערת”.
קישורים למגשים/שיחים כדי להבין את ההשפעה על תת-מערכות.
10. 3 יומנים/דוחות
סיכום של טיפות/שפיכת/גבולות, מפות חום לפי מסלול.
לוחות נפרדים לאינדקס הגינות.
10. 4 דוגמאות של SLO
"p99 בלום 300 ms בעומס 95 אחוזון; לשפוך 0. 1%; error_ratio קליטה 0. 5%».
”לפחות 95% מהמכסה מובטחת לשיעור האינטראקטיבי כאשר עומס יתר”.
11) דוגמאות הגדרות
11. 1 nginx: מגבלת קצב + פרץ + פיצול קנרית
nginx map $http_x_canary $canary { default 0; 1 1; }
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
upstream api_v1 { server 10. 0. 0. 1; }
upstream api_v2 { server 10. 0. 0. 2; }
server {
location /api/ {
limit_req zone=perip burst=20 nodelay;
if ($canary) { proxy_pass http://api_v2; break; }
proxy_next_upstream error timeout http_502 http_503 http_504;
proxy_pass http://api_v1;
}
}
11. 2 שליח: מפסק חשמלי + זיהוי חיצוני
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 1000 max_pending_requests: 500 max_requests: 2000 outlier_detection:
consecutive_5xx: 5 interval: 10s max_ejection_percent: 50 base_ejection_time: 30s
11. 3 איסטיו: דייר מכסה (רזרבה באמצעות תווית)
yaml apiVersion: security. istio. io/v1 kind: AuthorizationPolicy spec:
selector: { matchLabels: { app: api } }
rules:
- when:
- key: request. headers[x-tenant]
values: ["gold"]
Next - RateLimitPolicy in the limit provider with a large quota pool for "gold."
11. 4 רמזי QOS של קוברנטס
מובטח לתחתונים קריטיים (בקשות = גבולות).
PodePriority & Prevement: תחתונים קריטיים יזיזו צוואר תחתון רקע.
טופולוגיה מפזרת אילוצים: איזורים לקיימות.
12) אנטי דפוסים
הגבלת העין הגלובלית * 429/פסק זמן שגוי ללקוחות חשובים.
רטריי בלי ג 'יטר/אידמפוטנטיות * סערה.
בלבול של פסקי זמן (לקוח> שרת) * מקפיא ו ”עבודה כפולה”.
מטמונים/תורים נפוצים עבור פרוד וניסויים = זיהום נתונים.
”תמיד דביק” בלי שכל ישר.
זיהוי יוצא מנוטרל * מקרה רקוב מקלקל את המדדים של השבוע.
13) רשימת מימושים
[ ] תנועה: כיתות/דיירים/נתיבים.
[ ] הגדרת תקציבי היעד ל-RPS/חיבורים/בייטים ו-p95/p99.
[ ] אפשר הגבלת קצב (מקומי + גלובלי), מפסק חשמלי, גילוי יוצא.
[ ] הגדרת פיצול כנרית + גלגול אוטומטי על מדדים.
[ ] להקליט פסקי זמן/מגשים עם גיבוי מעריכי + jitter.
[ ] לאפשר ECN/BBR (היכן שניתן ליישם) fq_codel/HTB ליציאה.
[ ] בריכות בודדות/מטמונים/תורים לצל וניסויים.
[ ] לוחות מחוונים: מדדים של גבולות, תורים, איחור, הגינות.
[ ] SLO ו-Runbook: sheding/rollback/אפשר קריטריונים.
14) FAQ
ש: מה לבחור: עיצוב או שיטור?
א. עבור נתיבים מותאמים אישית - עיצוב (אנטי-חייזרים ללא טיפות). לשיעורי שירות ”רקע ”/” נפח ”- שיטור כדי להגן על זרימות קריטיות.
קיו: כיצד אתה נמנע מסופות נסיגה?
A: Gitterized Backoff, Limite of Nessions, idempotency, server מעלה את 'Retry-After', מכסות גלובליות.
קיו: דביק או חשיש?
A: דביק - כאשר נדרשת הפעלה/המטמון הוא מקומי למשתמש; כשצריך אחידות ויציבות של שריד.
קיו: מה נותן HTTP/3/QUIC?
א. ללא מנעולי TCP HOL, סבילות איבוד טובה יותר, התאוששות מהירה יותר - מפחיתה משמעותית את זנבות p99/p999.
15) סיכומים
עיצוב יעיל וניתוב L7 הוא מערכת עקבית של מדיניות: סדרי עדיפויות ומכסות, הפצה הוגנת, גבולות בטוחים וניתוב חכם, מגובה על ידי תצפית ו-SLO. על ידי ביצוע השיטות המתוארות (HTB/fq_codel/ECN ברמות הנמוכות יותר ו-Transboy/Istio/Nginx/eBPF בחלק העליון), תקבלו זנבות תלויים צפויים, התנגדות לעומס יתר ושחרורים מבוקרים ובטוחים.