Tere Habr!
Tuletame meelde, et jÀrgides raamatut umbes oleme avaldanud sama huvitava teose raamatukogust .

Praegu Ôpib kogukond selle vÔimsa tööriista piire tundma. Niisiis, hiljuti ilmus artikkel, mille tÔlget tahaksime teile tutvustada. Autor rÀÀgib oma kogemusest, kuidas muuta Kafka Streams hajutatud andmesalvestuseks. Nautige lugemist!
Apache raamatukogu kasutatakse kogu maailmas ettevĂ”tetes hajutatud vootöötluseks peale Apache Kafka. Ăks selle raamistiku alahinnatud aspekte on see, et see vĂ”imaldab salvestada niidi töötlemisel pĂ”hinevat kohalikku olekut.
Selles artiklis rÀÀgin teile, kuidas meie ettevĂ”ttel Ă”nnestus pilverakenduste turvalisuse toote arendamisel seda vĂ”imalust kasumlikult kasutada. Kafka Streamsi abil lĂ”ime jagatud oleku mikroteenused, millest igaĂŒks toimib tĂ”rketaluvusega ja vĂ€ga kĂ€ttesaadava usaldusvÀÀrse teabe allikana sĂŒsteemis olevate objektide oleku kohta. Meie jaoks on see samm edasi nii töökindluse kui ka toe lihtsuse osas.
Kui olete huvitatud alternatiivsest lĂ€henemisest, mis vĂ”imaldab teil kasutada ĂŒhtset keskandmebaasi, et toetada oma objektide formaalset seisukorda, lugege seda, see on huvitav...
Miks me arvasime, et on aeg muuta seda, kuidas me jagatud olekuga töötame?
Meil oli vaja sĂ€ilitada erinevate objektide seisukord agentide aruannete pĂ”hjal (nĂ€iteks: kas saiti rĂŒnnati)? Enne Kafka Streamsile ĂŒleminekut kasutasime oleku haldamisel sageli ĂŒhte keskandmebaasi (+ teenuse API). Sellel lĂ€henemisviisil on oma puudused: jĂ€rjepidevuse ja sĂŒnkroonimise sĂ€ilitamine muutub tĂ”eliseks vĂ€ljakutseks. Andmebaas vĂ”ib muutuda kitsaskohaks vĂ”i sattuda sinna ja kannatavad ettearvamatuse kĂ€es.

Joonis 1: TĂŒĂŒpiline jagatud oleku stsenaarium, mida nĂ€hti enne ĂŒleminekut
Kafka ja Kafka Streams: agendid edastavad oma vaateid API kaudu, vÀrskendatud olek arvutatakse keskandmebaasi kaudu
Tutvuge Kafka Streamsiga, mis muudab jagatud osariigi mikroteenuste loomise lihtsaks
Umbes aasta tagasi otsustasime nende probleemide lahendamiseks oma ĂŒhiseid stsenaariume pĂ”hjalikult lĂ€bi vaadata. Otsustasime kohe proovida Kafka Streamsi â teame, kui skaleeritav, hĂ€sti kĂ€ttesaadav ja tĂ”rketaluvus see on, millised rikkalikud voogedastusfunktsioonid sellel on (teisendused, sealhulgas olekupĂ”hised). Just see, mida vajasime, rÀÀkimata sellest, kui kĂŒpseks ja usaldusvÀÀrseks on Kafka sĂ”numisĂŒsteem muutunud.
KĂ”ik meie loodud olekupĂ”hised mikroteenused ehitati ĂŒsna lihtsa topoloogiaga Kafka Streamsi eksemplari peale. See koosnes 1) allikast 2) pĂŒsiva vĂ”tmevÀÀrtuse hoidjaga protsessorist 3) valamust:

Joonis 2. Meie voogesituse eksemplaride vaiketopoloogia olekupÔhiste mikroteenuste jaoks. Pange tÀhele, et siin on ka hoidla, mis sisaldab planeerimise metaandmeid.
Selle uue lĂ€henemisviisi korral koostavad agendid sĂ”numeid, mis suunatakse lĂ€hteteemasse, ja tarbijad â nĂ€iteks meiliteatiste teenus â saavad arvutatud jagatud oleku lĂ€bi valamu (vĂ€ljundteema).

Joonis 3: Uus ĂŒlesandevoo nĂ€ide jagatud mikroteenustega stsenaariumi jaoks: 1) agent genereerib sĂ”numi, mis jĂ”uab Kafka lĂ€hteteema juurde; 2) jagatud olekuga mikroteenus (kasutades Kafka Streams) töötleb seda ja kirjutab arvutatud oleku lĂ”plikku Kafka teemasse; mille jĂ€rel 3) tarbijad aktsepteerivad uut olekut
Hei, see sisseehitatud vÔtmevÀÀrtuste pood on tegelikult vÀga kasulik!
Nagu eespool mainitud, sisaldab meie jagatud oleku topoloogia vÔtmevÀÀrtuste salvestust. Leidsime selle kasutamiseks mitu vÔimalust ja kahte neist kirjeldatakse allpool.
Valik nr 1: kasutage arvutusteks vÔtmevÀÀrtuste salvestust
Meie esimene vĂ”tmevÀÀrtuste pood sisaldas arvutusteks vajalikke abiandmeid. NĂ€iteks mĂ”nel juhul mÀÀrati jagatud riik "enamuse hÀÀlte" pĂ”himĂ”ttel. Hoidlas vĂ”iks olla kĂ”ik viimased agendiaruanded mĂ”ne objekti oleku kohta. SeejĂ€rel, kui saime ĂŒhelt vĂ”i teiselt agendilt uue aruande, saime selle salvestada, hankida salvestuselt kĂ”igi teiste agentide aruanded sama objekti oleku kohta ja arvutust korrata.
Alloleval joonisel 4 on nÀidatud, kuidas me avasime vÔtme/vÀÀrtuste hoidla protsessori töötlemismeetodile, et uut sÔnumit saaks seejÀrel töödelda.

Illustratsioon 4: avame protsessori töötlemismeetodi vÔtmevÀÀrtuste hoidlale juurdepÀÀsu (pÀrast seda peab iga jagatud olekuga töötav skript seda meetodit rakendama doProcess)
Valik nr 2: CRUD API loomine Kafka Streamsi peal
Olles loonud oma pĂ”hiĂŒlesannete voo, hakkasime meie jagatud riigi mikroteenuste jaoks proovima kirjutada RESTful CRUD API-d. Tahtsime, et oleks vĂ”imalik hankida mĂ”ne vĂ”i kĂ”igi objektide olekut, samuti mÀÀrata vĂ”i eemaldada objekti olekut (kasulik taustaprogrammi toe jaoks).
KĂ”igi Get State API-de toetamiseks salvestasime selle pikka aega sisseehitatud vĂ”tmevÀÀrtuste salves, kui meil oli vaja olek töötlemise ajal ĂŒmber arvutada. Sel juhul muutub sellise API juurutamine ĂŒhe Kafka Streamsi eksemplari abil ĂŒsna lihtsaks, nagu on nĂ€idatud allolevas loendis:

Joonis 5. Sisseehitatud vÔtmevÀÀrtuste salvestusruumi kasutamine objekti eelarvutatud oleku saamiseks
Samuti on lihtne rakendada objekti oleku vÀrskendamist API kaudu. PÔhimÔtteliselt pole vaja teha muud, kui luua Kafka produtsent ja kasutada seda uut olekut sisaldava plaadi tegemiseks. See tagab, et kÔiki API kaudu genereeritud sÔnumeid töödeldakse samamoodi nagu teistelt tootjatelt (nt agentidelt) saadud sÔnumeid.

Joonis 6: Kafka tootja abil saate mÀÀrata objekti oleku
VĂ€ike komplikatsioon: Kafkal on palju vaheseinu
JÀrgmisena soovisime jagada töötlemiskoormust ja parandada saadavust, pakkudes jagatud oleku mikroteenuste klastri stsenaariumi kohta. Seadistamine oli imelihtne: kui konfigureerisime kÔik eksemplarid töötama sama rakenduse ID (ja samade alglaadimisserverite) all, tehti peaaegu kÔik muu automaatselt. Samuti tÀpsustasime, et iga lÀhteteema koosneb mitmest partitsioonist, nii et iga eksemplari saab mÀÀrata selliste partitsioonide alamhulga.
Mainin ka Ă€ra, et tavaks on teha osariigipoest varukoopia, et nĂ€iteks pĂ€rast tĂ”rget taastumise korral see koopia teisele eksemplarile ĂŒle kanda. Iga Kafka Streamsi osariigi poe jaoks luuakse paljundatud teema koos muudatuste logiga (mis jĂ€lgib kohalikke vĂ€rskendusi). Seega varustab Kafka pidevalt riigipoodi. SeetĂ”ttu saab ĂŒhe vĂ”i teise Kafka Streamsi eksemplari rikke korral olekusalve kiiresti taastada teisel eksemplaril, kuhu vastavad partitsioonid lĂ€hevad. Meie testid on nĂ€idanud, et seda tehakse mĂ”ne sekundiga, isegi kui poes on miljoneid plaate.
Liikudes ĂŒhelt jagatud olekuga mikroteenuselt mikroteenuste klastrile, muutub Get State API juurutamine vĂ€hem triviaalseks. Uues olukorras sisaldab iga mikroteenuse olekupood ainult osa tervikpildist (need objektid, mille vĂ”tmed olid seotud konkreetse partitsiooniga). Pidime kindlaks mÀÀrama, milline eksemplar sisaldab vajaliku objekti olekut, ja tegime seda lĂ”ime metaandmete pĂ”hjal, nagu allpool nĂ€idatud:

Joonis 7: Voo metaandmete abil mÀÀrame, millisest eksemplarist soovitud objekti olekut kĂŒsida; sarnast lĂ€henemist kasutati GET ALL API puhul
Peamised jÀreldused
Kafka Streamsi osariigi kauplused vÔivad toimida de facto hajutatud andmebaasina,
- pidevalt paljundatud Kafkas
- Sellise sĂŒsteemi peale saab hĂ”lpsasti ehitada CRUD API
- Mitme partitsiooni kÀsitlemine on veidi keerulisem
- Samuti on vĂ”imalik lisaandmete salvestamiseks lisada voogedastustopoloogiasse ĂŒks vĂ”i mitu olekusalvesti. Seda valikut saab kasutada:
- Arvutusteks vajalike andmete pikaajaline sÀilitamine voo töötlemise ajal
- Andmete pikaajaline salvestamine, mis vÔib olla kasulik voogesituse eksemplari jÀrgmisel korral
- palju rohkem...
Need ja muud eelised muudavad Kafka Streamsi hĂ€sti sobivaks globaalse seisundi sĂ€ilitamiseks meie omaga sarnases hajutatud sĂŒsteemis. Kafka Streams on osutunud tootmises vĂ€ga töökindlaks (meil pole pĂ€rast selle kasutuselevĂ”ttu praktiliselt ĂŒhtegi sĂ”numit kadunud) ja oleme kindlad, et selle vĂ”imalused ei piirdu sellega!
Allikas: www.habr.com
