Քեշինգի ռազմավարությունը
1) Ինչու՞ քաշել և որտե՞ ղ դա անել։
Քեշը արագ հիշողության շերտն է, որը նվազեցնում է լատենտությունը և բեռը թանկ ռեսուրսների վրա (CPU/BD/արտաքին API)։ Կարևոր նպատակներ
Արագությունը (p95/p99 ցածր), արժեքը (ավելի քիչ egress/CPU), կայունությունը (ավելի քիչ կախվածություն պիկի տակ)։
Պիկի հարթումը և «աղմկոտ հարևաններից» մեկուսացումը։
Տիպիկ մակարդակները
1. Հաճախորդը (զննարկիչ/բջջային) - HTTP-քեշ, IndexeddDB, wwww.al storage։
2. Edge/CDN - POP-112 ավելի մոտ օգտագործողի, ստատիկա և API-ի մի մասը։
3. L7-դարպասը/Reverse-proxy-Nginx/Envoy/Varnish (միկրոկեշ, SWR)։
4. Ծառայողական քեշը Redis/Memcached-ն է։
5. Ներերակային - in-memory (Caffeine/Guava/LRU-map)։
6. Քեշը BD-ում նյութական ներկայացումներ են, հիբրիդային ինդեքսներ։
Կանոնն այն է, որ հնարավորինս մոտ լինեք սպառողին, բայց ճշմարտությունը պահեք մեկ անգամ։
2) Keshing Patterns
2. 1 Cache-aside (“lazy loading”)
Ծրագիրը նախ կարդում է քեշից։ բաց թողնելիս 'աղբյուրից, ապա գրում է քեշին։
Պլյուսներ ՝ պարզություն, վերահսկողություն։ Մինուսները 'սառը մեկնարկները, հեռացման պատուհանները։
2. 2 Read-through
Ընթերցումը միշտ քեշի միջոցով է, որն ինքնին գնում է աղբյուրին պրոմախի ժամանակ (գրադարան/հավաքող շերտ)։
Հարմար է կենտրոնացնել TTL/սերիլիզացիան։
2. 3 Write-through / Write-back (write-behind)
Write-through-ը 'քեշի ձայնագրումը և աղբյուրը սինխրոնորեն համապատասխանում է վերևի համակարգմանը, լատինականությունը ավելի բարձր է։
Write-back: Քեշի ձայնագրումը, ասինխրոն ֆլեշ ձայնագրությունը աղբյուրում արագ է, բայց միգրացիայի և հակամարտությունների ռիսկերը։
2. 4 Refresh-ahead (proactive)
Կանխատեսում է «շուտով ոչնչացնել TTL» և նորարարել բանալին ֆոնի վրա, կանխելով stampede։
2. 5 Negative caching
Քեշինգը «չկա տվյալներ/404/դատարկ» կարճ TTL-ի վրա նվազեցնում է աղբյուրի բեռը։
2. 6 Micro-caching
Շատ կարճ TTL (0։ 5-5 s) L7-ում «գրեթե դինամիկայի» համար (ցուցակները, հիմնականը) - կտրուկ նվազեցնում է պոչը։
3) HTTP-kash: վերնագրեր և վերահսկողություն
3. 1 Հիմնական վերնագրեր
`Cache-Control`: `max-age`, `s-maxage` (для shared кэшей), `public/private`, `no-store`, `stale-while-revalidate`, `stale-if-error`.
Վալիդատորներ ՝ «ETag» (բովանդակության հեշ), «Lox-Modified»։
Պայմաններով հարցումները '«If-None-Match», «If-Modified-Since» 36304 Dist Modified։
3. 2 Vary և բանալիներ
«Vary: Accept-Encoding, Authorization, Cookie, Accept-Language» - ձևավորում է քեշի տարբեր տարբերակներ։ Microsoft 'Vary ", որպեսզի չխանգարի" պայթեցնել "կարդինալությունը։
3. 3 HTTP պատասխանը
Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=60
ETag: "a1b2c3"
Vary: Accept-Encoding
4) Windows և TTL նախագծումը
4. 1 Բանալիներ
Կառուցեք '
Խուսափեք PII-ից։
Հավաքածուների համար + հարցման պարամետրեր (նորմալ և հեռացված)։
4. 2 TTL և համաձայնություն
Կարճ TTL-ն նվազեցնում է անհամաձայնությունը, բայց ավելացնում է բացթողումները։
Կրիտիկական տվյալների համար 'վալիդատորներ («ETag») և SWR (stale-wile-revalidate)։
Հազվադեպ փոփոխողների համար 'երկար TTL + «bombook» հաշմանդամության համար։
4. 3 Տարբերակումը/բաստինգը
Անհամատեղելի փոփոխություններով 'փոխեք նախածանցը/ստեղնաշարի տարբերակը («v2-v3»)։
Ստատիկ ռեսուրսների համար ֆայլի անունով ententh hash-ն է։
5) Հաշմանդամություն 'ռազմավարություն և պրակտիկա
5. 1 Ուղիղ հեռացում
«DEL key »/« PURGE» -ը մրցույթի վրա։ Վտանգը 'հեռացման և բազմաթիվ ընթերցողների միջև մրցավազքը։
5. 2 Tegi/Surrogate keys
Փաստաթուղթը կապեք մի շարք թեստերի հետ (կատեգորիա/հեղինակը)։ Հաշմանդամությունը թեգով է։
В Varnish/Edge — `Surrogate-Key: article:42 tag:author:7` + `BAN tag:author:7`.
5. 3 Event-driven հաշմանդամություն
Pub/Sub (Kafka/NATS) 'աղբյուրի փոփոխության ժամանակ, մենք հրապարակում ենք «medalidate» իրադարձությունը։
Քեշի կոնսուումերները լսում և թարմացնում են բանալիները։
5. 4 Երկբևեռ
Նախ, մենք փակցնում ենք հնացած բանալին (sporTTL), սլայդը, նորարարության և ատոմային փոխարինման ֆոնին։
6) Պայքարը stampede/dogpile և տաք բեկորների հետ
6. 1 Request coalescing (singleflight)
Մեկ արտադրողը նորարարում է բանալին, մնացածը սպասում են արդյունքին (մյուտեքս/պիտակը «նորարարվում է»)։
6. 2 Jitter к TTL
Ավելացրեք պատահականությունը (10-20%) TTL-ի հետ, որպեսզի խուսափեք սինխրոն խորտակումից։
6. 3 Soft-TTL + hard-TTL
Մինչև Soft-TTL-ը քեշից, զուգահեռ refresh-ը։ hard-TTL-ն համարվում է բացթողումներ։
6. 4 Տաք բանալիներ
Տեղական քեշները ընդհանուր (two-tier) վերևում։
Տաք ստեղնաշարի կրկնապատկումը մի քանի գնդակների և ռանդոմային ընտրության մեջ (միայն read-only)։
Rate limit-ը կոնկրետ բանալին նորարարելու համար։
6. 5 Օրինակ Redis + Lua (singleflight)
lua
-- SETNX lock with TTL to avoid deadlocks local ok = redis. call("SET", KEYS[1], "1", "NX", "EX", ARGV[1])
if ok then return "LOCKED"
else return "WAIT"
end
7) Դուրս մղելու և քեշի ընդունելու քաղաքականություն
7. 1 Eviction
LRU 'պարզապես և լավ տեղական համար։
LFU 'ավելի լավ է «երկար» տաք բաների ժամանակ։
ARC/TinyLFU: recency/frequency հավասարակշռությունը։
7. 2 Admission (1934)
Թույլ մի տվեք հսկայական հազվագյուտ օբյեկտներ (TinyLFU/Bloom ֆիլտրեր)։
Մեծ արժեքների թեմը (LZ4/Zstd) սահմանին «չափի/լատենտության»։
8) Շարդինգը և տեղաբանությունը
8. 1 Consistent hashing
Կայուն բաշխում է ստեղները, նվազեցնում շարժումները աճի/սեղմման ժամանակ։
8. 2 Redis/Memcached
Redis Cluster (արցունքներ/շարդներ), Sentinel (feilover), read-only կրկնօրինակումը։
Memcached-ը Sharding-ի հաճախորդն է (ketama hashing), առանց վերարտադրման սերվերի մակարդակում։
8. 3 Տեղական + բաշխված
Կասկադ 'in-proc (միկրո-TTL/LRU) no Redis (TTL ավելի երկար) ռուսական աղբյուրը։
Զգույշ եղեք TTL-ի և քաշ-վալիդատորների հետ։
9) Edge, CDN և L7-kes
9. 1 Micro-cache на Nginx
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m inactive=10m;
map $request_method $skip_cache { default 0; POST 1; PUT 1; DELETE 1; }
server {
location /api/list {
if ($skip_cache) { add_header Cache-Control "no-store"; }
proxy_cache api;
proxy_cache_valid 200 2s; # micro-cache proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on; # SWR add_header X-Cache $upstream_cache_status;
proxy_pass http://upstream;
}
}
9. 2 Envoy (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. http. cache. file_system_http_cache. v3. FileSystemHttpCacheConfig cache_path: "/var/cache/envoy"
9. 3 Varnish (Surrogate keys)
Օգտագործեք «Surrogate-Key» և «ban» պիտակները փաթեթային հաշմանդամության համար։
10) Քեշը և տվյալների ներդաշնակությունը
10. 1 Read-your-writes
Օգտագործողների համար/զամբյուղները տրամադրեք կամ կարճ TTL, կամ ձայնագրությունը քեշի միջոցով (write-through) կամ հաճախորդի մակնշումը (bypass N վայրկյանում ձայնագրելուց հետո)։
10. 2 Eventual vs Strong
Խորհրդատվական/վերլուծական համար 'eventium + երկար TTL։
Փողի/պատվերների կարգավիճակի համար կարճ TTL, վալիդացիա, երբեմն առանց քեշի կրիտիկական ճանապարհների վրա։
10. 3 Ինվարանտներ
Մի քշեք այն դաշտերը, որոնք ազդում են անվտանգության/ACL-ի վրա, առանց խիստ TTL-ի և տեխնիկական ստուգման։
11) Դիտարկումը, SLO և կառավարումը
11. 1 Մետրիկա
hit_ratio (общий и per-route), byte_hit_ratio, miss_rate.
stampede_prevented_total, refresh_ahead_total, ban/purge_total.
Լատենտ ՝ p50/p95/p99 աղբյուրից։
hot _ keys _ topN և նրանց QPS/բայթ։
11. 2 Լոգներ և հետքեր
Լոգո 'X-Cache: HIT/MISS/STALE/MSATING "։
Թրեյսներում նշեք պատասխանների աղբյուրը ("cache = www.ru", "tier = edge" wwww.ru ")։
11. 3 SLO մոտեցում
Օրինակ ՝ "API/catalog p99-250 ms, cache hit 2485 տոկոսը, stampede 240-ը։ Հարցումների 1 տոկոսը"։
11. 4 Runbooks
«Promahi» -ը սկսում է ստուգել TTL-ը, տաքացումը/հաշմանդամությունը, hot-keys-ը, քեշի չափը և ընդունման քաղաքականությունը։
12) Անվտանգություն և մուլտֆիլմ-տենանտիզմ
Կառուցեք tenault-id բանալին (և «Vary» -ում HTTP-ում)։
Մի՛ քշեք մասնավոր պատասխանները որպես «public»։
Ծածկագրեք զգայուն տվյալներ կամ պահեք միայն-PII/ID։
13) Տիպային բաղադրատոմսեր
13. 1 Գրացուցակ/ժապավեն (գրեթե դինամիկա)
Edge-միկրոկեշ 1-3 + SWR-ի հետ, ներսում 'Redis-ը 15-60 s-ով, հաշմանդամություն ունեցող։
13. 2 Օգտագործողի պրոֆիլը
Cache-aside-ը TTL 30-120 s, bypass 5-10-ից հետո (cookie/heder) կամ write-through-ից։
13. 3 Վալյուտո դասընթացներ/ուղեցույցներ
Երկար TTL (րոպե ժամացույց) + նպատակային հաշմանդամություն նոր տվյալների հրապարակման ժամանակ; «ETag» պայմանական GET-ի համար։
13. 4 Որոնման խառնուրդ
Edge-միկրոքեշ 1-2 s, ներսում 'refresh-ahead և coalescing, query-international բանալին։
14) Anti-patterna
Քեշը առանց հաշմանդամության 'հույսը միայն TTL-ի վրա երկար պատուհաններ է։
Հսկա 'Vary': «պայթյունը» տարբերակները ցածր hit-rate են։
Մեկ քեշը կոդավորման/experiments-ի համար բացատրվում է աղտոտումը։
Չկա պաշտպանություն stampede piki աղբյուրի վրա TTL-ի մասնակցությամբ։
Փողի/իրավունքների/ACL-ն առանց խիստ երաշխիքների։
Ֆինլանդիան «միայն անընդմեջ» - ավելացված CPU, փ99 վատացումը փոքր օբյեկտներում։
15) Ներդրման չեկի ցուցակ
- Քեշի և նրանց նպատակների ստանդարտ մակարդակները (edge/www.dal)։
- Նախագծեք բանալիները (տարբերակումը, tenault, ստանդարտացումը)։
- Ընտրեք pattern (cache-aside/read-through/refresh-ahead)։
- TTL/sport-TTL/jitter, միացրեք SWR-ը։
- Իրականացրեք coalescing/singleflight, պաշտպանություն stampede-ից։
- Հաշմանդամություն կազմակերպեք (իրադարձություններ, թեգեր, purge/ban)։
- Մուտքագրեք hit-ratio/լատենտ և dashbords 'X-Cache "։
- Տաք բեկորներով բեռի թեստեր կատարեք։
- Բացեք SLO և runbooks։
- Անվտանգություն/tenault-մեկուսացում և «Vary»։
16) FAQ
Q 'Ի՞ նչ ընտրել' cache-aside կամ read-through։
A 'Պարզ ծառայությունների համար' cache-aside։ Անհրաժեշտ է կենտրոնացում և միասնական քաղաքականություն 'read-through։
Q: Ինչպե՞ ս հասկանալ օպտիմալ TTL-ը։
Ա 'Հեռացեք թույլատրելի չափից, հաճախականությունից և www.hit-rate; ավելացրեք jitter և դիտեք r95/r99/արժեքը։
Q: Ե՞ րբ է տեղավորվում write-back-ը։
A 'Բարձր բեռնված հոսքերի համար, որտեղ ընդունելի է eventium-կոնսիստենտիվությունը և կա հուսալի հերթը/լոգը «վերագրելու» համար։
Q 'Հնարավո՞ ր է արդյոք գուշակել հեղինակի պատասխանները։
Այո, բայց տեղադրեք «private» և/կամ միացրեք tenault/user բանալին/« Vary »։ Truly-private-ի համար հաճախորդների քեշն է։
Q 'Ինչպե՞ ս տաքացնել քեշը։
A 'Հանրաճանաչ կոմպոզիցիաների ցուցակները, background-wormer, replay logs, տաքացնելով ձուլման/պիկի առջև (սև ուրբաթ և այլն)։
17) Արդյունքները
Արդյունավետ քեշինգը wwww.+ խելացի TTL + դիզայնն է, որը իրավասու է արտոնագիր, որն ամրապնդվում է հաշմանդամություն ունեցող անձանց, SWR/refresh-ahead և պաշտպանություն stampede-ից։ Բաժանեք քեշը մակարդակներում (հաճախորդ/edge/ծառայություն), ավելացրեք դիտարկումը և SLO-ը, և կստանաք կայուն լատենտային պոչեր, կանխատեսելի արժեք և դիմադրություն պիցցիոն բեռների նկատմամբ։