GH GambleHub

Ֆոսֆատորների գեներացիան

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-ը 'խիտ մոնոտոնիայի և կարճ պարամետրերի համար (ժամանակի կարգապահության դեպքում), հաջորդականությունները' տեղական սեղանների համար, բովանդակության հեշը 'արտեֆակտների համար։ Ուշադրություն դարձրեք դիտողությանը և թեստերին, և ցուցիչները կդադարեն լինել անակնկալների աղբյուր։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Telegram
@Gamble_GC
Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։