VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

MĂ”ni pĂ€ev tagasi toimus konverents Hydra. JUG.ru Group kutsus unistuste esinejad (Leslie Lamport! Cliff Click! Martin Kleppmann!) ja pĂŒhendas kaks pĂ€eva jaotatud sĂŒsteemidele ja arvutustele. Contour oli ĂŒks kolmest konverentsi partnerist. Me suhtlesime stendis, rÀÀkisime oma jaotatud ladudest, mĂ€ngisime bingo't, lahendasime ĂŒlesandeid.

See postitus sisaldab ĂŒlesannete lahendusi Contouri stendilt nende autori poolt. Kes oli Hydra's - see on vĂ”imalus meenutada meeldivaid muljeid, kes ei olnud - vĂ”imalus oma mĂ”tteid pingutada. big O-mĂ€rkusega.

Kohal olid isegi osalejad, kes tuletasid flipperi slaididele, et salvestada oma lahendused. Ma ei naljata - nad esitasid kontrollimiseks sellise paberikuhja:

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

Kokku oli kolm ĂŒlesannet:

  • replikate valik kaalude jĂ€rgi koormuse tasakaalustamiseks
  • pĂ€ringu tulemuste sortimine in-memory andmebaasis
  • oleku edastamine jaotatud sĂŒsteemis ringikujulise topoloogiaga

Ülesanne 1. ClusterClient

Pidi pakkuma efektiivset K valimise algoritmi N-st kaalutud replikate jaotatud sĂŒsteemis:

Teie meeskond peab arendama klientide raamistiku massiliselt jaotatud N sĂ”lme klastrile. Raamistik jĂ€lgib erinevaid metainformatsiooni, mis on seotud sĂ”lmedega (nt nende latentsus, 4xx/5xx vastuste mÀÀr jne) ja mÀÀrab neile ujuvad kaalud W1..WN. Toetades samaaegse tĂ€itmisstrateegiat, peaks raamistiku olema vĂ”imeline juhuslikult valima K N sĂ”lme – valimise tĂ”enĂ€osus peaks olema proportsionaalne sĂ”lme kaaluga.

Paku ĂŒlesanne sĂ”lmede efektiivseks valimiseks. Hinda selle arvutuslikku keerukust, kasutades suurt O mĂ€rkust.

Miks on kÔik inglise keeles?

Sest sellisel kujul vĂ”itlesid nende vastu konverentsi osalejad ja kuna inglise keel oli Hydra ametlik keel. Ülesanded nĂ€gid vĂ€lja jĂ€rgmiselt:

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

VĂ”tke paber ja pliiats, mĂ”elge, Ă€rge kiirustage kohe spoilerite avamisega 🙂

Lahenduse arutelu (video)

Algus 5:53, kestvus kokku 4 minutit:

Vaata videot

Nii esitasid oma lahenduse need samad poisid, kes olid flippide tahvlitega:

Vaata videot

Lahenduse arutelu (tekst)

Pinnal on selline lahendus: liita kokku kĂ”ikide replikate kaalud, genereerida juhuslik number vahemikus 0 kuni kĂ”ikide kaalude summani, seejĂ€rel valida selline i-replika, et replikate kaalude summa vahemikus 0 kuni (i-1)-ni on vĂ€iksem juhuslikust numbrist, ja replikate kaalude summa vahemikus 0 kuni i-ni on sellest suurem. Nii saab valida ĂŒhe replika ning jĂ€rgmise valimiseks tuleb kogu protseduur uuesti lĂ€bi viia, arvesse vĂ”tmata valitud replikat. Sellise algoritmiga on ĂŒhe replikate valimise keerukus O(N), K replikate valimise keerukus on O(N·K) ~ O(NÂČ).

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

Ruutfunktsioon on halb, kuid seda on vĂ”imalik parandada. Selleks ehitame segmentpuu kaalude summade jaoks. Saame puu, mille sĂŒgavus on lg N, mille lehtedes asuvad replikate kaalud ja teistes sĂ”lmedes osalised summad, jĂ”udes puu juures kĂ”ikide kaalude summani. JĂ€rgmiseks genereerime juhusliku numbri vahemikus 0 kuni kĂ”ikide kaalude summani, leiame i-replika, eemaldame selle puust ning kordame protseduuri ĂŒlejÀÀnud replikate otsimiseks. Sellise algoritmiga on puu ehitamise keerukus O(N), i-replika otsimise ja selle puust eemaldamise keerukus on O(lg N), K replikate valimise keerukus on O(N + K lg N) ~ O(N lg N).

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

Lineaarlogaritmiline keerukus on meeldivam kui ruutline, eriti suurte K-de puhul.

Just see algoritm on rakendatud koodis ClusterClient raamatukogus projektis „Ida“. (Seal ehitatakse puu O(N lg N) ajaga, kuid see ei mĂ”juta algoritmi lĂ”plikku keerukust.)

Ülesanne 2. Zebra

Vajati algoritmi, mis tÔhusalt sorteerib dokumente mÀlus mingi suvalise indekseerimata vÀlja jÀrgi:

Teie meeskond on ĂŒlesandeks arendada ĆĄarded mĂ€ludokumentide andmebaasi. TĂŒĂŒpiline koormus oleks valida top N dokumenti, mis on sorteeritud suvalise (indekseerimata) numbrilise vĂ€lja jĂ€rgi kollektsioonist suurusega M (tavaliselt N < 100 << M). Veidi vĂ€hem levinud koormus oleks valida top N pĂ€rast top S dokumentide vahelejĂ€tmist (S ~ N).

Pakkuge algoritm, mis vÔimaldab selliseid pÀringuid tÔhusalt tÀita. Hindake selle arvutuslikku keerukust suur O mÀrkega keskmises ja halvimas stsenaariumis.

Lahenduse arutelu (video)

Algus 34:50, kokku 6 minutit:

Vaata videot

Lahenduse arutelu (tekst)

Lahendus on pinnapealne: sorteerida kĂ”ik dokumendid (nĂ€iteks kasutades quicksort), seejĂ€rel vĂ”tta N+S dokumenti. Sellisel juhul on keskmine sortimise keerukus O(M lg M), halvim O(MÂČ).

Ilmselgelt ei ole tĂ”hus kĂ”iki M dokumente sortida, et seejĂ€rel ainult vĂ€ike osa neist vĂ”tta. Et mitte sortida kĂ”iki dokumente, sobib algoritm quickselect, mis valib N+S vajalikke dokumente (neid saab sorteerida ĂŒkskĂ”ik millise algoritmi abil). Sel juhul vĂ€heneb keerukus keskmiselt O(M)-ni, kuid halvim juhtum jÀÀb samaks.

Siiski on vĂ”imalik veelgi efektiivsemalt tegutseda — kasutada algoritmi binary heap streaming. Sel juhul kogutakse esimesed N+S dokumenti min- vĂ”i max-heap'i (sĂ”ltuvalt sorteerimise suunast), seejĂ€rel vĂ”rreldakse iga jĂ€rgmist dokumenti puu juurega, kus asub hetkel minimaalne vĂ”i maksimaalne dokument, ja vajadusel lisatakse see puusse. Sel juhul halvim juhtum, kui puu tuleb pidevalt ĂŒmber ehitada — O(M lg M), keskmine keerukus — O(M), nagu quickselecti puhul.

Kuid heap streaming osutub tĂ”husamaks, kuna praktikas saab suure osa dokumentidest kĂ”rvale jĂ€tta, ilma et oleks vaja kĂŒhveldust ĂŒmber ehitada, pĂ€rast ĂŒhte vĂ”rreldumist juureelemendiga. Selline sorteerimine on rakendatud dokumendipĂ”hises mĂ€lu andmebaasis Zebra, mis on vĂ€lja töötatud ja mida kasutatakse Konturis.

Ülesanne 3. Olekuvahetused

Pidi olema kÔige efektiivsem algoritm olekute liigutamiseks:

Teie ĂŒlesanne on arendada keeruline olekuvahetuse mehhanism jaotatud N sĂ”lmega klastris. i-nda sĂ”lme olek tuleks edastada (i+1)-ndale sĂ”lmele; N-nda sĂ”lme olek tuleks edastada esimesele sĂ”lmele. Ainsaks toetatud toiminguks on olekuvahetus, kui kaks sĂ”lme vahetavad oma olekud aatomiliselt. On teada, et olekuvahetus vĂ”tab aega M millisekundit. Iga sĂ”lm suudab osaleda ĂŒhes olekuvahetuses igal hetkel.

Kui kaua lÀheb aega kÔikide sÔlmede olekute edastamiseks klastris?

Lahenduse arutelu (tekst)

Pinnapealne lahendus: vahetada esimese ja teise elemendi olekud, seejĂ€rel esimese ja kolmanda, seejĂ€rel esimese ja neljanda jne. Iga vahetuse jĂ€rel satub ĂŒhe elemendi olek soovitud positsioonile. Peab tegema O(N) ĂŒmberkorraldust ja kulutama O(N·M) aega.

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

Lineaarne aeg on pikk, seega saab elemente vahetada paaridena: esimest teisega, kolmandat neljandaga jne. Iga vahetuse jĂ€rel satub iga teise elemendi olek soovitud positsioonile. Peab tegema O(lg N) ĂŒmberkorraldust ja kulutama O(M lg N) aega.

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

Kuid nihke saab teha veelgi efektiivsemaks — mitte lineaarselt, vaid konstantselt. Selleks tuleb esimeses sammus vahetada esimese elemendi olek viimasena, teise eelviimasena ja nii edasi. Viimase elemendi olek jĂ”uab vajaliku positsiooni. NĂŒĂŒd tuleb vahetada teise elemendi olek viimasega, kolmanda eelviimasega ja nii edasi. PĂ€rast seda ĂŒmmargust vahetust asuvad kĂ”ik elementide olekud vajalikes positsioonides. Kokku tehakse O(2M) ~ O(1) ĂŒmberpaigutust.

VÀÀringud Hydra konverentsilt — koormuse tasakaalustamine ja in-memory salvestused

Selline lahendus ei ĂŒllata matemaatikut, kes veel mĂ€letab, et pööramine on kahe teljega sĂŒmmeetri kompositsioon. Muide, seda saab trivialiseeritult ĂŒldistada nihkega mitte ĂŒhe, vaid K < N positsiooni kohta. (Kirjutage kommentaarides, kuidas tĂ€pselt.)

Kas sulle meeldisid ĂŒlesanded? Kas tead muid lahendusi? Jagage kommentaarides.

Ja siin on mÔned kasulikud lingid lÔpetuseks:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster