Ֆոսֆատորների գեներացիան
1) Ինչո՞ ւ ուշադրություն դարձնել ագրեսորներին
Express (ID) - էության հիմնական բանալին 'BD տողերը, հաղորդագրությունները, ֆայլը, պատվերը։ Նրա հատկություններից կախված են
Յուրահատուկ և մասշտաբը (կոնլիզիա, հորիզոնական աճը)։
Կարգը և տեսակավորումը (ժամանակավոր հարաբերակցությունը, կրկնօրինակումը, դեդուպը)։
Պահեստավորման արտադրողականությունը (ինդեքսներ, տաք էջեր, ստեղնաշարի չափը)։
Անվտանգությունը (անկանխատեսելիություն, արտահոսք, գուշակություն)։
Juzabiliti/2019 (կարճ, URL-safe, չի զգայուն գրանցի)։
ID-ի ընտրությունը փոխզիջում է էնտրոպիայի, կարգաբերման, երկարության, արագության և գործողության միջև։
2) Հիմնական պահանջները և տերմինները
Եզակիությունը 'բախման հավանականությունը պետք է լինի ընդունելի ռիսկի ցածր։
Էնտրոպիա. «Քանի՞ պատահականություն» պարունակում է ID (բիթ)։
Կարգավորում (Time-sortable/k-sortable) 'ժամանակի լեքսիկոգրաֆիկ տեսակավորում։
Մոնոտոնիա 'հանգույցի/հոսքի ներսում չսպառող հաջորդականություն։
Ձայնագրման տեղայնությունը 'ինչքան նոր ներդիր կենտրոնանում է ինդեքսի «պոչում» (տաք էջերի վտանգը)։
Կանխատեսելիությունը 'կարո՞ ղ եք գուշակել հարևան ID-ը (կարևոր է անվտանգության/API)։
Ներկայացում 'երկուական/կառուցվածքային, Base16/32/36/58/64, դեֆիս, գրանցամատյան։
3) Լուծողների հիմնական ընտանիքները
3. 1 UUID
v4 (random) ՝ 122 բիթ էնտրոպիա։ Անկասկած, լավ է անվտանգության և պարզության համար։ Մինուս '«հաոտիտ» ինդեքսները պատահական բաշխման պատճառով, որ, այնուամենայնիվ, հավասարապես ցրում է բեռները և հեռացնում «տաք էջերը»։
v1 (time + MAC) 'մենք պատվիրում ենք, բայց կրում է MAS/ժամանակ (գաղտնիություն); հաճախ խուսափում են։
v7 (Time-ordered) 'միլիոնավոր ժամանակը + randome մասը։ Դիզայնը ժամանակի լեքսոգրաֆիկ տեսակավորման և BD-ում լավ ագրեսիայի տակ է։ Փոխզիջում 'հայտնվում է ինդեքսի «տաք պոչը»։ բուժվում է շարդիզացիայի/նախածննդյան/պարամետրերի միջոցով։
Խորհուրդ
Արտաքին API-ի և ոչ խիստ պահանջների համար 'v4։
Իրադարձական/լոգային BD-ի և «տեսակավորված» համար 108-v7։
3. 2 ULID (Crockford Base32)
Բիթ '48 բիթ ժամանակի (ms) + 80 բիթ պատահականություն։ Լեքսիկոգրաֆիկ կերպով տեղավորվում է ժամանակի ընթացքում, մարդ-ընկերական (առանց 'I, L, O, U'), URL-safe։ Գոյություն ունի մոնոնալ տատանումներ (ժամանակի նույն կետում պատահական մասը ավելանում է)։
Առավելություններ ՝ ընթերցում, կարգավորում, հանդուրժողականություն։
Մինուսներ 'ժամանակի շատ բարձր հաճախականությամբ' «տաք պոչը»։
3. 3 KSUID
160 բիթ ՝ 32 բիթ ժամանակի (վայրկյան) համեմատած + 105 բիթ պատահականության դարաշրջանի հետ։ Ավելի ժամանակավոր միջակայք և կայուն տեսակավորում, տողերը ավելի կարճ են, քան ULID-ը։ (ոչ, ավելի երկար, բայց իր կոդավորմամբ), լավ է բաշխված լոգարանների և օբյեկտների համար։
3. 4 Winowflake նման (k-sortable flake IDS)
Դասական սխեմա (կարգավորված)
[ timestamp bits ][ region/datacenter bits ][ worker bits ][ sequence bits ]
Հատկությունները 'մոնոտոնային աճը, քվասի-գլոբալ յուրացումը, կարճ (64 բիթ) երկուական ներկայացումը։
Ռիսկերը 'ժամացույցից կախվածությունը (dreef/reift), մեկ հյուսվածքի sequence սպառումը, region/worker բիթերի համակարգումը։
Բուժվում է 'պաշտպանություն «clock back» -ից, sequence պահուստից, ժամանակի դետեկտորից, PTP/NTP կարգապահությունից։
3. 5 BD հաջորդականություն (SEQUENCE/IDENTITY)
Ամենապարզ մոնոնային արտադրությունը մեկ SUBD/շարդում։
Պլյուսներ ՝ կարճ, արագ, հարմար տեղական սեղանների համար։
Մինուսներ 'դժվար է գլոբալ կլաստերի մեջ։ կանխատեսելի (անապահով որպես հանրային բանալին) ստեղծում է ինդեքսի տաք պոչը։
3. 6 Բովանդակություն-հասցեային ID (hash entent)
SHA-256/Blake3 պարունակությունից պատրաստված կայուն ID, deduplication, ամբողջականության ստուգում, քեշինգ։
Պլյուսներ ՝ դետերմինիզմ, պաշտպանություն փոխարինումից։
Մինուսներ ՝ թանկ արտադրություն (CPU), գործնական թել, ժամանակավոր տեսակավորում, երկարությունը։
4) Կոլիզիա և «ծննդյան օրվա պարադոքս» (ինտուիտիվ)
Պատահական ID չափի «b 'bit» -ի հավանականությունը «n» գեներացիաների մոտ է
p ≈ 1 - exp (-n (n-1 )/2/2 ^ b) ≈ n ^ 2/2 ^ (b + 1) (for small p)
Օրինակներ
UUIDv4 (122 բիթ) n = 10 ^ 12 (տրիլիոն) 4p 41e-14 (անտեսանելի)։
64-բիթանոց ռանդան պատրաստված է n = 10 ^ 9-ով արդեն p-0։ 027 (նկատելի ռիսկ)։
Եզրակացությունը 'պատահականության 64-բիթը հաճախ քիչ է հսկայական համակարգերի համար։ օգտագործեք 96/105 բիթ։
5) Ինդեքսներ, տաք էջեր և պահեստավորում
Պատահական բանալիները (v4) հավասարապես բաժանում են պարամետրերը ինդեքսի ծառի վրա, ոչ թե «պոչը», բայց ավելի վատ, քան քեշ-տեղանքը։
Սորտերը ժամանակի ընթացքում (v7/ULID/Winowflake) տեղադրվում են «պոչի մեջ» ավելի լավ տեղանք և ագրեսիա, բայց տաք էջերի ռիսկը բարձր զուգահեռ ձայնագրությունների տակ։
«Տաք պոչի» արտահայտումը
նախածանցներ/շարդինգ tenault/region (ավելացնել 1-2 բայթ ժամանակի առաջ);
interleaving: պատահականության մի մասը մեծ բիթերում;
BRIN/կլաստերիզացիա մեծ լոգարանների համար։
Չափը կարևոր է
"UID (16B)" vs 'BIGINT (8B) "/" INT8 "խնայում է հիշողությունը/քեշը; Base32/58/64 տողերը ավելացնում են 20-60 տոկոսով։ BD-ի համար պահեք երկուական, շարահյուսեք եզրին։
6) Անվտանգությունն ու գաղտնիությունը
Չօգտագործեք SEQUENCE/INT-ը որպես հանրային ID URL/API-ում 'գուշակություններ ռեսուրսների փոխանցման համար։
Ավելացրեք ռանդոմային, անկանխատեսելի ID (v4/v7/ULID/KSUID) արտաքին հղումների համար։
Մի կոդավորեք PII-ը ID-ում։ Եթե դուք պետք է միացնեք կոդավորումը, կոդավորեք/ստորագրեք (օրինակ, JWE/JWS) կամ օգտագործեք անթափանց հոսանքներ։
URL անվտանգ կոդավորումը ՝ Base32 Crockford, Base58 (առանց «0OIl»), Base64url։
7) Multi-tenantizy, prefics և միկրոօրգանիզացիա
Ձևաչափ ՝ «[TENIM _ IV FIX] - [ID]» կամ binarno: «tenrone _ id nodid»։
Պլյուսներ ՝ արագ ֆիլտրեր/վարձակալության կուսակցություններ, N + 1 սկաններից պաշտպանություն։
Մինուսները, կարող են վատացնել էնդրոպիայի խտությունը մեծ բիթերում, մտածեք բաշխման մասին (հեշ նախածանց)։
Hash-sufffix (2-3 բայթ) նվազեցնում է և օգնում է shard-routing- ին ՝ «shard = hash (id)% N»։
8) Ընտրության գործնական առաջարկներ
API, հանրային հղումներ, բաշխված ծառայություններ առանց խիստ կարգի 'UUIDv4, ULID/KSUID։
Լոգա/իրադարձություններ/պատվերներ, որտեղ հաճախ արտահանում ենք ժամանակի ընթացքում 'UUIDv7 կամ ULID (մոնոտոն)։
Գերբնական անցումը տեղական մոնոտոնությամբ և կարճ բանալիով 'Winowflake-նման 64-բիթ (պահանջվում է ժամանակի կարգապահություն)։
Eurothefakts/blobs: Բովանդակություն-հասցեային (SHA-256), իսկ վերևում 'մարդու-ընկերական կարճ «վիտրինը» (Hashids/հղում)։
Տեղական աղյուսակները մեկ BD-ում 'SEQUENCE/IDENTITY + արտաքին «շրջանակ» հանրային հղումների համար (wwww.king)։
9) Իրականացումներ և օրինակներ
9. 1 PostgreSQL
Պահպանեք UUID-ը երկուական, ինդեքսները '«btree» կամ «hash» կարիքներով։
sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE orders (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(), -- или uuid_generate_v4()
created_at timestamptz NOT NULL DEFAULT now(),
tenant smallint NOT NULL
);
-- For time-sortable (UUIDv7) store binary (uuid), generation in the application.
-- If you want a cluster by time:
CREATE INDEX ON orders (created_at DESC);
Sequential hot fix: Time-sorted ID-ի համար ավելացրեք «աղ» հին բիթերում կամ նվագարկեք ten.ru։
sql
CREATE TABLE orders_t1 PARTITION OF orders FOR VALUES IN (1);
CREATE TABLE orders_t2 PARTITION OF orders FOR VALUES IN (2);
9. 2 Redis (ատոմային հաշվիչներ/մոնուտոնիա)
bash
INCR "seq: orders" # local sequence combine: epoch_ms<<20 (worker_id<<10) (seq & 1023)
9. 3 Diowflake նման գեներատոր (կեղծ)
pseudo const EPOCH = 1704067200000 # custom epoch (ms)
state: last_ms=0, seq=0, worker=7, region=3
next():
now = epoch_ms()
if now < last_ms: wait_until(last_ms) # защита от clock back if now == last_ms:
seq = (seq + 1) & ((1<<12)-1) # 12 бит if seq == 0: wait_next_ms()
else:
seq = 0 last_ms = now return (now-EPOCH)<<22 region<<17 worker<<12 seq
9. 4 ULID/UUID ծրագրերում
Go
go
// ULID t:= time. Now(). UTC()
entropy:= ulid. Monotonic(rand. New(rand. NewSource(t. UnixNano())), 0)
id:= ulid. MustNew(ulid. Timestamp(t), entropy)
//UUID v7 (if there is a library)
id:= uuid. Must(uuid. NewV7())
Node. js
js import { ulid } from 'ulid';
import { v4 as uuidv4 } from 'uuid';
const id1 = ulid();
const id2 = uuidv4(); // v4
Python
python import uuid, time id_v4 = uuid. uuid4()
For v7, use a library (for example, uuid6/7 third-party packages)
10) Կոդավորում և ներկայացում
Binarno-ում («BYTIM», «UUID») պատրաստված է կոմպակտ և արագ։ Շրջանակի վրա փոխարկեք
Base32 Crockford (ULID) 'անգիտակից գրանցում, առանց տեսողական նման խորհրդանիշների։
Base58 'ավելի կարճ, քան Base32/64 մարդկային հոսանքների համար, URL-safe-ի համար։
Base64url: կարճ, բայց 'և _' URL-ում։
Կայունացրեք գրանցումը և ձևաչափը (դեֆիզներ/դրանց բացակայությունը), որպեսզի խուսափեք կրկնօրինակներից տողերի համեմատությամբ։
11) Թեստային պլեյբուկներ և դիտողություններ
Կոլիզիա 'մետրիկ «id _ colision _ total» (պետք է լինի 0), ալերտ> 0-ով։
Նախածանցների բաշխումը 'մեծ բայթերի հիստոգրամը, փնտրում է գնումներ։
Շարժիչի արագությունը '«ids _ per _ sec», գեներատորի պ99 լատենտ։
Clock skew (Winowflake-ի համար) 'հանգույցների օֆսեթ, «clock went back» իրադարձությունները։
Ինդեքսային պոչերը ՝ p95/p99 'INSSA' latency; արգելափակման/տաք էջերի մասնաբաժինը։
Game day:- «Clock drift/back» ներարկումը համոզված է, որ գեներատորը սպասում է/անջատվում։
- «Sequence» -ի հալեցումը միլիոնավոր վայրկյանում ցույց է տալիս next _ 108 սպասման ստուգումը։
- Զանգվածային զուգահեռականությունը բացատրվում է, թե արդյոք ինդեքսում արգելափակման փոթորիկներ չկան։
12) Anti-patterna
DIM _ INCREME/SEQUENCE որպես հանրային ID 'գողանում, արտահոսք։ Օգտագործեք հանրային անթափանց ID-ը ներքին վերևում։
UUIDv1 (MAS/ժամանակ) դուրս է գալիս 'գաղտնիությունը։
64-բիթանոց պատահական ID-ը ձայնագրությունների տրիլիոնների վրա 'իրական բախման ռիսկ։
Համաշխարհային «կենտրոնական գեներատոր» առանց HA: SPOF և նեղ տեղ։
Time-sorted IDS-ը առանց clock back-ից պաշտպանելու 'դուբլիկատներ/reports։
ID-ի տարբեր ձևաչափերի խառնուրդը առանց ակնհայտ տարբերակի/նախածանցային տարբերակի։
ID-ի պահպանումը որպես գծեր տարբեր գրանցումներով/ձևերով ցույց են տալիս թաքնված կրկնօրինակներ։
13) Ներդրման չեկի ցուցակ
- Ընտրվել է ձևաչափը (v4/v7/ULID/KSUID/Winowflake/SEQ/hash) վճարման պահանջների համար։
- Սահմանվում են կարգադրության պահանջները (արդյո՞ ք պետք է տեղայնացումը)։
- Գնահատված է կոնֆլիկտների հավանականությունը (b bit, n) և ռիսկի հակումը։
- Նախագծված է կոդավորումը (երկուական BD + մարդկային վիտրինը)։
- Time-sorted-ի համար 'պաշտպանություն clock back, sequence-limits և NTP/PTP կարգապահությունից։
- Հանրային ID-ի համար - անկանխատեսելիություն (rand/ULID/KSUID), PII բացակայություն։
- Shard rowting (hash (id)% N), multi-tenant նախածանց։
- Դիտարկումը 'փոխակերպման, բաշխման, ուշացման, clock skew։
- Sequence/բարձր մրցակցություն/երկարությունը։
- Ձևաչափը, տարբերակը, դարաշրջանը, բիթանոց գծանշանը և միգրացիայի պլանը։
14) FAQ
Q 'Ի՞ նչ ընտրել «լռելյայն» միկրովայրկյանների համար։
A: UUIDv7 կամ ULID 'ժամանակի կարգավորում, շատ էնտրոպիա, պարզ արտադրություն եզրին։ Արտաքին API-ի համար 'ULID/UUIDv4 նույնպես մոտավոր։
Q 'Անհրաժեշտ է կարճ և մարդկային ID։
A: ULID/KSUID կամ Base58 կոդավորումը պատահական/ժամանակավոր ID բիթ։ Հիշեք երկարության և փոխկապակցվածության մասին։
Q 'Կարո՞ ղ եք անել «կարճ թվային» ID, բայց ապահով։
Այո, պահեք ներքին SEQ-ը, իսկ բացեք opaque-ը (96-105 բիթ) կամ Hashids-ը աղով + ստորագրություն։
Q 'Ինչպե՞ ս գաղթել SEQ-ից UUIDv7-ում։
Ա 'Մուտքագրեք նոր սյունակը' id _ new "(UUID), գնացեք, նոր ID-ի հղումների հրապարակումը, ապա IV/արտաքին կոդերի փոխակերպումը և հին հեռացումը։
Q: Ինչու՞ են իմ ULID-ի հետ կապված ընկերությունները դարձել «տաք»։
Ա 'Դուք դնում եք խիստ աճող բանալիներ մեկ ինդեքսում։ Վերլուծեք կուսակցության/ten.ru, խառնեք հին բիթերը, օգտագործեք batch-2019։
15) Արդյունքները
Լավ ID-ը առաջադրանքի համար ճիշտ հատկությունների շարք է 'բավականին էնտրոպիա, կանխատեսելի տեսակավորում (եթե անհրաժեշտ է), ապահով հրապարակայնություն և ինդեքսների առողջ գործողություն։ Ընտրեք UUIDv4/ULID/UUIDv7/KSUID պարզության և բաշխման համար, Diowflake-ը 'խիտ մոնոտոնիայի և կարճ պարամետրերի համար (ժամանակի կարգապահության դեպքում), հաջորդականությունները' տեղական սեղանների համար, բովանդակության հեշը 'արտեֆակտների համար։ Ուշադրություն դարձրեք դիտողությանը և թեստերին, և ցուցիչները կդադարեն լինել անակնկալների աղբյուր։