Pereiti prie turinio

Skaidymas į dalis

DocStore kiekvienam įrašui sukuria po vieną failą. Neskirsčius į dalis, didelėje kolekcijoje visi failai būtų viename kataloge, o didėjant įrašų skaičiui katalogo operacijos lėtėtų. Todėl storh įrašų failus suskirsto pagal du įrašo ID simbolius:

Text
pages/data/2d/018bcfe5-6800-7000-8000-2d5dba6274da.jsonc

Katalogas parenkamas pagal paskutinės UUID grupės pradžią (24-ąjį ir 25-ąjį simbolius), kuriuose yra atsitiktinių duomenų. Du šešioliktainiai simboliai sudaro 256 katalogų, todėl 100k įrašų kolekcijoje vidutiniškai viename kataloge bus mažiau nei 400 failų.

Kodėl naudojami galiniai, o ne pradiniai simboliai

UUIDv7 ID prasideda 48 bitų laiko žyma milisekundžių tikslumu, todėl panašiu metu sukurti ID turi bendrų pradinių simbolių. Skaidant pagal pradžią, kiekvienas įrašų antplūdis patektų į tą patį intensyviai naudojamą katalogą, o katalogai keistųsi tik bėgant laikui. Įrašo galiniai baitai kiekviename įraše atsitiktiniai, todėl įrašai tolygiai paskirstomi iškart nuo pirmojo.

Skaidymas į dalis skaitymo ir užklausų veikimo nekeičia: get() pagal ID apskaičiuoja katalogą, o stream() grąžina įrašus, surikiuotus pagal ID visuose kataloguose, todėl puslapiavimas pagal žymeklius veikia taip, lyg kolekcija būtų vienas surikiuotas sąrašas.

Didėjant apimčiai

Katalogų skaičius niekada nedidėja: du šešioliktainiai simboliai reiškia 256 katalogų, nepriklausomai nuo kolekcijos dydžio. Daugėja failų kiekviename kataloge:

Įrašai Failų kataloge
10k ~40
100k ~390
1M ~3,900
10M ~39,000

Šiuolaikinės failų sistemos indeksuoja katalogų įrašus, todėl keli tūkstančiai failų kataloge leidžia greitai rasti įrašus pagal ID; 1M įrašų apimtis patogi naudojant get() ir indeksuotas užklausas. Saugyklos atidarymas trunka tiek pat laiko nepriklausomai nuo kolekcijos dydžio: našlaičių laikinųjų failų paieška vykdoma tik tada, kai paliktas neveikiančio rašytojo žymeklis rodo, kad ankstesnis procesas užstrigo rašydamas. Didėjant apimčiai tiesiškai ilgėja visos kolekcijos operacijos: neindeksuoti skenavimai, reindex() ir verify() peržiūri kiekvieną įrašo failą, todėl šias operacijas laikykite paketinėmis užduotimis. Kai kolekcijoje yra daugiau nei maždaug 10M įrašų, ima rūpėti failų skaičius kataloge ir bendras inode naudojimas: skaidykite kolekcijas arba naudokite segmentuotą žurnalą duomenims, kurie skenuojami, nes taip failų skaičius išlieka nedidelis.

Kiti varikliai

SegmentedLog ir Queue neskirsto duomenų į dalis, nes nekuriamas atskiras failas kiekvienam įrašui. Žurnalas prideda įrašus į segmentų failus kataloge segments/, kurių dydį riboja max_segment_bytes (pagal numatytuosius nustatymus – 1 MiB), o eilė prideda įvykius į vieną queue.log. Todėl failų skaičius išlieka nedidelis.