CDN caching και βελτιστοποίηση TTL
Σύντομη Περίληψη
Μια μνήμη CDN είναι ένας «επιταχυντής + ασπίδα» μεταξύ του χρήστη και της προέλευσης. Λειτουργεί καλά όταν:1. Το κλειδί κρυφής μνήμης είναι σταθερό και δεν περιέχει «θόρυβο».
2. Πολιτική TTL υπό φόρτιση: 's-maxage '/' max-age' + 'stale-while-clalate/if-error'.
3. Η διαχείριση της αναπηρίας γίνεται με ετικέτες/προθέματα + «μαλακό» καθάρισμα.
4. Περιλαμβάνονται κλιμακωτή κρύπτη/θωράκιση προέλευσης και αρνητική κρύπτη.
5. Υπάρχει μια παρατηρησιμότητα: hit-ratio από στρώματα, p95 TTFB, return share 304.
Κεφαλίδες βάσης και τι σημαίνουν
«Cache-Control»:- 'max-age =
' - TTL για περιηγητή. - 's-maxage =
' - TTL για CDN/διαμεσολαβητή (επικαλύπτει 'max-age'). - «stale-while-revalidate =
» - παρέχει παρωχημένη, επικαιροποίηση παράλληλα. - 'stale-if-error =
' - επιστρέφουμε το ξεπερασμένο όταν συμβεί το σφάλμα προέλευσης. - 'immutable' - ο πόρος δεν αλλάζει (κατάλληλο για επαληθευμένα περιουσιακά στοιχεία).
- 'ETag '/' Last-Modified' - προϋποθέσεις για 304, εκτός από bytes/CPU προέλευσης.
- 'Vary' - μια λίστα με κεφαλίδες που επηρεάζουν το κλειδί κρυφής μνήμης (χρήση με συγκράτηση!).
- «Υποκατάστατο-έλεγχος» - «επεκτεινόμενο» Cache-Control για CDN (εάν υποστηρίζεται).
- «Εκπνέει» - είναι παρωχημένο, αλλά εξακολουθεί να λαμβάνεται υπόψη από τους πελάτες.
Cache-Control: public, max-age=31536000, immutable
Παράδειγμα (ημι-ηχείο με ασφαλή απαρχαίωση):
Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600, stale-if-error=86400
ETag: "a1c3..."
Σχεδιασμός και κανονικοποίηση κλειδιών
Ο στόχος είναι ουσιαστικά τα ίδια αιτήματα να εμπίπτουν στο ίδιο αντικείμενο.
Ομαλοποίηση URL: περίπτωση, διπλές σχισμές, σχισμή ίχνους, σειρά παραμέτρων ερωτημάτων.
Αγνοήστε τον «θόρυβο»: 'utm _',' fbclid ',' gclid ', αυθαίρετες ετικέτες ref.
Περιορισμένη ποικιλία: μόνο πραγματικά σημαντικοί τίτλοι ('Accept-Encoding', μερικές φορές 'Accept', 'Accept-Language' locale).
Κατηγορία συσκευής: εάν είναι απαραίτητο, χρησιμοποιήστε 2-3 κλάσεις (κινητά/επιτραπέζια/ταμπλέτα), όχι ατελείωτα κλαδιά χρήστη-πράκτορα.
Auth context: μην αποθηκεύετε ιδιωτικά εξ ορισμού. χρήση υπογεγραμμένων URL/παράκαμψης cookies ή χωριστών δημόσιων/ιδιωτικών διαδρομών.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
στρατηγικές TTL ανά τύπο περιεχομένου
Πολιτικές αναπηρίας
Με URL/Πρόθεμα: "σκούπισε τα πάντα κάτω από '/στατικό/2025-11-05/'.
Με ετικέτα/κλειδί: «αφαίρεση όλων των 'καταλόγων' και 'γινόμενο: 123'».
Απαλή εκκαθάριση: σημειώστε ως παρωχημένο, μην σβήσετε το αντικείμενο - ταχύτερη επαναπλήρωση.
Καθοδηγούμενη από γεγονότα: CI/CD ή admin event επικαλείται webhook «ακυρωμένες ετικέτες».
Σύσταση: Συνδυάστε και τις δύο τακτικές: διαδρομές έκδοσης για περιουσιακά στοιχεία + εκκαθάριση ετικετών για περιεχόμενο/σελίδες.
Κλιμακωτή κρύπτη, θωράκιση προέλευσης и προθάλαμος
Κλιμακωτή κρύπτη: περιφερειακά στρώματα CDN → λιγότερα αιτήματα καταγωγής.
Θωράκιση προέλευσης: μία «ασπίδα» POP προς προέλευση - βελτιώνει την τοποθεσία και την αναλογία επιτυχίας.
Προγεμισμένη συσκευή τύπου πένας: Προθέρμανση θερμών URL/κρυψώνων πριν από την εκδήλωση/απελευθέρωση.
Αρνητική κρύπτη: κρύπτη 5xx/Timeout για σύντομο χρονικό διάστημα (30-120 s) ώστε να μην κατακλύζεται η προέλευση με θύελλα ρετρά.
API Cache: Πότε μπορείτε
Μόνο GET/HEAD και idempotent.
Κλειδί: διαδρομή + βασικά ερωτήματα (για παράδειγμα, '? κατηγορία =... & σελίδα =... ').
Επικύρωση: 'ETag '/' Last-Modified' και σύντομη 's-maxage'.
Φίλτρα ανά χρήστη: εξατομίκευση της συνάρτησης πελάτη/άκρου ή χρήση υπογεγραμμένων αιτήσεων + «δημόσια» απάντηση.
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
Προστασία από δηλητηρίαση από κρύπτη
Ομαλοποίηση σκληρού URL/κεφαλίδας. Λευκή λίστα παραμέτρων στο κλειδί.
Απόκρυψη ύποπτων κεφαλίδων/αντιγράφων ('X-Forward-', επέκταση 'Accept').
Ορίστε το 'Vary' και ελέγξτε το μέγεθος/τον αριθμό των κεφαλίδων.
Διαχωρισμός τομέα: private/admin - σε ξεχωριστό όνομα χωρίς κρύπτη.
Επικύρωση των απαντήσεων: μην κρύπτετε 4xx (εκτός από 404 για στατικές), μην κρατάτε σελίδες «χρήστη» χωρίς ρητή πολιτική.
Συμπίεση και μορφότυποι
Brotli για κείμενο (js/css/json), gzip - back; τα προσυμπιεσμένα στοιχεία ενεργητικού είναι αποδεκτά.
Εικόνες: webp/avif όπου υποστηρίζεται. Χρήση 'Vary: Αποδοχή' + παραγώγων.
Αιτήματα για βίντεο/ήχο: κομμάτια CDN caches.
Περιεχόμενο - Διαπραγμάτευση: Διατηρήστε χαμηλή τη βασική πληθικότητα (κλάση συσκευών αντί ακατέργαστων UA).
Παρατηρησιμότητα και SLO
Βασικές μετρήσεις
Λόγος επιτυχίας (με ψηφιολέξεις/αιτήματα) на άκρη/βαθμίδα/ασπίδα.
p50/95/99 TTFB ανά περιφέρεια και τύπο (στατική/API).
Ρυθμός πλήρωσης/Έξοδος προέλευσης - πόσο πηγαίνει στην προέλευση.
Ποσοστό 304 και μέσο μέγεθος απόκρισης.
Σφάλμα προϋπολογισμού: μερίδιο των ζητημάτων «stale-if-error »/« SWR». συχνότητα καθαρισμού.
παραδείγματα SLO
"p95 TTFB 'statics σε περιφερειακό επίπεδο ≤ 120-150 ms, API GET cached ≤ 200-250 ms.
Στατικά hit-ratic ≥ 90%, ημι-ηχεία ≥ 60%.
Το ποσοστό των απαντήσεων από το μπαγιάτικο υποκατάστημα με σφάλματα ≤ 0. 5% σε 30 ημέρες.
Φύλλα εξαπάτησης Config
Nginx (αντίστροφος διαμεσολαβητής πριν από το CDN ή σε αυτο-PoP)
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CDN:512m max_size=100g inactive=7d;
map $args $clean_args {
"~(^ &)(utm_ gclid fbclid) """; # default $ args simplified example;
}
server {
listen 443 ssl http2;
set $cache_key "$scheme$request_method$host$uri?$clean_args $http_accept $http_accept_encoding";
location /static/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_ignore_headers Set-Cookie;
add_header Cache-Control "public, s-maxage=86400, max-age=3600, stale-while-revalidate=600" always;
proxy_pass https://origin_static;
}
location /api/public/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_cache_valid 200 30s;
add_header Cache-Control "public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600" always;
proxy_set_header If-None-Match $upstream_http_etag;
proxy_pass https://origin_api;
}
}
Απεσταλμένος (SWR + αρνητική μνήμη, έννοια)
yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. cache. simple_http_cache. v3. SimpleHttpCacheConfig
Cache-Control/Surrogate-Control Header Cache Policies
We cache 5xx errors briefly via route/retry policy + local_rate_limit
Κεφαλίδες για «γρήγορα» περιουσιακά στοιχεία
Cache-Control: public, max-age=31536000, immutable
ETag: "hash"
Content-Encoding: br
Κεφαλίδες για ημι-ηχεία (καταλόγους)
Cache-Control: public, s-maxage=600, max-age=120, stale-while-revalidate=1800, stale-if-error=86400
Vary: Accept-Encoding, Accept
FinOps: Πώς εξοικονομεί χρήματα τα μετρητά
↓ προέλευσης εξόδου, μικρότερο φορτίο CPU/DB → χαμηλότερο κόστος υποδομής.
Λιγότερα αιτήματα για πληρωμένα backends (αναζήτηση/δείκτης/εικόνες).
Μέτρηση στόχου: $/μείωση του p95 και $/μείωση της εξόδου κατά 1 GB - παρακολουθήστε το αποτέλεσμα μετά την εκτόξευση.
iGaming/fintech special
Κατάλογοι/περιουσιακά στοιχεία παρόχων: εκδοθείσες διαδρομές + ετήσια TTL.
Προσγειώσεις εκδηλώσεων/τουρνουά: 1-5 λεπτά 's-maxage' + 'SWR' για 10-30 λεπτά. εκκαθάριση ετικετών κατά την αναβάθμιση.
Σελίδες LIV (συντελεστές/πίνακες): μερική κρύπτη μπλοκ JSON, σύντομη TTL (5-30 s), για προσωπικά μπλοκ - απόδοση πελάτη.
PSP/καταληκτικά σημεία πληρωμής: μην κρυφτείτε, μην αποθηκεύετε αυστηρά Cache μόνο βιβλία αναφοράς (πίνακες BIN, καταστάσεις).
Αντίμπορο: στατική/αποθήκευση GET, γκρίζες διαδρομές για ύποπτες ASN. κρατήσει «Vary» έξω από θορυβώδεις τίτλους.
Κατάλογος ελέγχου εφαρμογής
- Κλειδί Cache περιγράφεται: ομαλοποίηση URL, λίστα επιτρεπόμενων ερωτήσεων, 'Vary' μόνο για το επιθυμητό.
Διαχωρισμένες διαδρομές δημόσιου/ιδιωτικού τομέα. ιδιωτικό - «no-store» και παράκαμψη CDN.
- Κλίμακες TTL ανά τύπο περιεχομένου που εισήχθη. ρυθμισμένο 'SWR/εάν-σφάλμα'.
- διατεταγμένη κλιμακωτή κρύπτη + θωράκιση προέλευσης· αρνητική μνήμη 5xx (σύντομη) ενεργοποιημένη.
- Υπάρχει ετικέτα/URL εκκαθάριση, μαλακή εκκαθάριση? ολοκλήρωση με CI/CD.
- Περιλαμβάνει συμπίεση (br/gzip), μορφότυπους εικόνων ιστού και απαντήσεις εύρους.
- Μετρήσεις: λόγος επιτυχίας ανά στρώμα, p95 TTFB, 304, έξοδος προέλευσης. ειδοποιήσεις για αστοχίες.
- Playbooks: προθέρμανση κρύπτης πριν από τις κορυφές, εκκαθάριση έκτακτης ανάγκης, υποβάθμιση προέλευσης.
Κοινά σφάλματα
Μη versio περιουσιακά στοιχεία με μεγάλες δέσμες TTL → «sticky» από χρήστες.
Το υπερβολικό 'Vary' (από το 'User-Agent', όλες οι κεφαλίδες) → μια έκρηξη πληθικότητας και μια χαμηλή αναλογία hit-ratio.
Caching 4xx/401/403/ιδιωτικό περιεχόμενο.
Έλλειψη αρνητικής μνήμης → χιονοστιβάδα αιτήσεων υποβαθμισμένης καταγωγής.
Καμία ετικέτα-καθαρισμός → μαζική εκκαθάριση σημείου και επαναπλήρωση καταιγίδας.
Το κλειδί κρυφής μνήμης περιλαμβάνει «θορυβώδεις» παραμέτρους UTM/ref.
Πολύ σύντομο TTL για στατικά → επιπλέον φορτίο σε CDN και προέλευση.
Mini playbooks
1) Προθέρμανση της κρύπτης πριν από την εκδήλωση
1. Συλλογή top-N URL από logs → 2) Παράλληλη prefetch (περιορισμένη ταχύτητα) ανά περιοχή → 3) Check hit-ratio ↑ και p95 ↓.
2) Κατολόγοι μαλακού καθαρισμού έκτακτης ανάγκης
1. Αποστολή 'PURGE '/ετικετών-clear → 2) Το CDN δίνει μπαγιάτικο και τραβάει φρέσκο με το φόντο → 3) Ελέγξτε ότι δεν υπάρχουν ακίδες για την προέλευση.
3) Αποτυχία καταγωγής
1. Το «stale-if-error» βοηθά τις X ώρες → 2) να ενεργοποιηθεί το πανό «τεχνική εργασία» στην άκρη → 3) Κατά την ανάκτηση - η προθέρμανση του στόχου.
Αποτέλεσμα
Ισχυρή στρατηγική CDN = σωστό κλειδί μνήμης + ουσιαστικό TTL με SWR/if-error + διαχειριζόμενη αναπηρία + κλιμακωτή/ασπίδα + παρατηρησιμότητα. Καθορίστε την πολιτική στις κεφαλίδες και το IaC, μετρήστε τον λόγο επιτυχίας και το p95, σχεδιάστε να ζεσταθείτε στις κορυφές - και οι χρήστες θα λαμβάνουν πάντα μια γρήγορη απάντηση, και η προέλευση θα παραμείνει ζωντανή ακόμα και στην πιο ζεστή ώρα.