Labdien, strÄdÄju DRD KP projekta komandÄ (izplatÄ«ts datu reÄ£istrs riteÅu komplektu dzÄ«ves cikla uzraudzÄ«bai). Å eit es vÄlos dalÄ«ties mÅ«su komandas pieredzÄ, izstrÄdÄjot uzÅÄmuma blokÄ·Ädi Å”im projektam tehnoloÄ£iju ierobežojumu apstÄkļos. Es galvenokÄrt runÄÅ”u par Hyperledger Fabric, taÄu Å”eit aprakstÄ«to pieeju var ekstrapolÄt uz jebkuru atļautu blokÄ·Ädi. MÅ«su pÄtÄ«juma galvenais mÄrÄ·is ir sagatavot uzÅÄmuma blokÄ·Ädes risinÄjumus tÄ, lai galaprodukts bÅ«tu patÄ«kami lietojams un to nebÅ«tu pÄrÄk grÅ«ti uzturÄt.
Å eit nebÅ«s atklÄjumu, negaidÄ«tu risinÄjumu un netiks izcelti unikÄli notikumi (jo man tÄdu nav). Es tikai vÄlos padalÄ«ties ar savu pieticÄ«go pieredzi, parÄdÄ«t, ka ātas bija iespÄjamsā un, iespÄjams, komentÄros palasÄ«t par citu cilvÄku pieredzi, pieÅemot labus un ne tik labus lÄmumus.
ProblÄma: blokÄ·Ädes vÄl netiek mÄrogotas
MÅ«sdienÄs daudzu izstrÄdÄtÄju centieni ir vÄrsti uz to, lai blokÄ·Äde kļūtu par patiesi Ärtu tehnoloÄ£iju, nevis par bumbu ar laika degli skaistÄ iesaiÅojumÄ. StÄvokļa kanÄli, optimistisks apkopojums, plazma un sadalÄ«Å”ana, iespÄjams, kļūs par ikdienu. KÄdu dienu. Vai varbÅ«t TON atkal atliks palaiÅ”anu uz seÅ”iem mÄneÅ”iem, un nÄkamÄ plazmas grupa beigs pastÄvÄt. MÄs varam ticÄt nÄkamajam ceļvedim un naktÄ« lasÄ«t izcilas baltÄs grÄmatas, bet Å”eit un tagad mums kaut kas jÄdara ar to, kas mums ir. Padari sÅ«dus.
MÅ«su komandai izvirzÄ«tais uzdevums paÅ”reizÄjÄ projektÄ kopumÄ izskatÄs Å”Ädi: ir daudz subjektu, kas sasniedz vairÄkus tÅ«kstoÅ”us, kuri nevÄlas veidot attiecÄ«bas uz uzticÄ«bas pamata; Ir nepiecieÅ”ams izveidot DLT risinÄjumu, kas darbosies uz parastajiem personÄlajiem datoriem bez Ä«paÅ”Äm veiktspÄjas prasÄ«bÄm un nodroÅ”inÄs lietotÄja pieredzi, kas nav sliktÄka par jebkuru centralizÄtu grÄmatvedÄ«bas sistÄmu. RisinÄjuma pamatÄ esoÅ”ajai tehnoloÄ£ijai ir jÄsamazina iespÄja ļaunprÄtÄ«gi manipulÄt ar datiem ā tÄpÄc blokÄ·Äde ir Å”eit.
Saukļi no baltajÄm grÄmatÄm un plaÅ”saziÅas lÄ«dzekļiem mums sola, ka nÄkamÄ attÄ«stÄ«ba ļaus mums veikt miljoniem darÄ«jumu sekundÄ. Kas tas Ä«sti ir?
Mainnet Ethereum paÅ”laik darbojas ar ~30 tps. Å Ä« iemesla dÄļ vien ir grÅ«ti uztvert to kÄ blokÄ·Ädi, kas jebkÄdÄ veidÄ ir piemÄrota korporatÄ«vajÄm vajadzÄ«bÄm. Starp atļautajiem risinÄjumiem ir etaloni, kas rÄda 2000 tps (
Latentums
Aizkave no darÄ«juma uzsÄkÅ”anas brīža lÄ«dz tÄs galÄ«gajai apstiprinÄÅ”anai sistÄmÄ ir atkarÄ«ga ne tikai no Ätruma, kÄdÄ ziÅojums iziet cauri visiem validÄcijas un pasÅ«tÄ«Å”anas posmiem, bet arÄ« no bloka veidoÅ”anas parametriem. Pat ja mÅ«su blokÄ·Äde ļauj mums veikt saistÄ«bas ar Ätrumu 1000000 10 488 tps, bet prasa XNUMX minÅ«tes, lai Ä£enerÄtu XNUMX MB bloku, vai mums tas kļūs vieglÄk?
SÄ«kÄk apskatÄ«sim darÄ«jumu dzÄ«ves ciklu programmÄ Hyperledger Fabric, lai saprastu, kur tiek pavadÄ«ts laiks un kÄ tas ir saistÄ«ts ar bloku Ä£enerÄÅ”anas parametriem.
Åemts no Å”ejienes:
(1) Klients izveido transakciju, nosÅ«ta to apstiprinoÅ”ajiem partneriem, pÄdÄjie simulÄ darÄ«jumu (piemÄro Ä·Ädes koda veiktÄs izmaiÅas paÅ”reizÄjam stÄvoklim, bet neuzÅemas saistÄ«bas virsgrÄmatÄ) un saÅem RWSet - atslÄgu nosaukumus, versijas un vÄrtÄ«bas āāÅemts no kolekcijas CouchDB, (2) indoseri nosÅ«ta atpakaļ klientam parakstÄ«tu RWSet, (3) klients vai nu pÄrbauda visu nepiecieÅ”amo vienaudžu (endosoru) parakstu esamÄ«bu, un pÄc tam nosÅ«ta darÄ«jumu pasÅ«tÄ«Å”anas dienestam. , vai nosÅ«ta to bez verifikÄcijas (pÄrbaude joprojÄm notiks vÄlÄk), pasÅ«tÄ«Å”anas pakalpojums veido bloku un (4) nosÅ«ta atpakaļ visiem vienaudžiem, ne tikai apstiprinÄtÄjiem; vienaudži pÄrbauda, āāvai lasÄ«Å”anas komplekta atslÄgu versijas atbilst versijÄm datu bÄzÄ, vai visiem atbalstÄ«tÄjiem ir paraksti, un visbeidzot veic bloku.
Bet tas vÄl nav viss. VÄrdi āpasÅ«tÄ«tÄjs veido blokuā slÄpj ne tikai transakciju secÄ«bu, bet arÄ« 3 secÄ«gus tÄ«kla pieprasÄ«jumus no lÄ«dera sekotÄjiem un atpakaļ: vadÄ«tÄjs pievieno ziÅojumu žurnÄlam, nosÅ«ta to sekotÄjiem, pÄdÄjais pievieno. uz viÅu žurnÄlu, nosÅ«ta vadÄ«tÄjam apstiprinÄjumu par veiksmÄ«gu replikÄciju, vadÄ«tÄjs apstiprina ziÅojumu, nosÅ«ta apstiprinÄjumu sekotÄjiem, sekotÄji apÅemas. Jo mazÄks ir bloka lielums un izveides laiks, jo biežÄk pasÅ«tÄ«Å”anas dienestam bÅ«s jÄpanÄk vienprÄtÄ«ba. Hyperledger Fabric bloku veidoÅ”anai ir divi parametri: BatchTimeout ā bloka veidoÅ”anas laiks un BatchSize ā bloka lielums (transakciju skaits un paÅ”a bloka lielums baitos). TiklÄ«dz kÄds no parametriem sasniedz limitu, tiek atbrÄ«vots jauns bloks. Jo vairÄk pasÅ«tÄ«juma mezglu, jo ilgÄks laiks bÅ«s nepiecieÅ”ams. TÄpÄc jums ir jÄpalielina BatchTimeout un BatchSize. Bet, tÄ kÄ RWSets ir versijas, jo lielÄku bloku veidojam, jo āālielÄka ir MVCC konfliktu iespÄjamÄ«ba. TurklÄt, palielinoties BatchTimeout, UX katastrofÄli pasliktinÄs. SekojoÅ”Ä shÄma Å”o problÄmu risinÄÅ”anai man Ŕķiet saprÄtÄ«ga un paÅ”saprotama.
KÄ izvairÄ«ties no bloka pabeigÅ”anas gaidÄ«Å”anas un nezaudÄt iespÄju izsekot darÄ«juma statusam
Jo ilgÄks veidoÅ”anÄs laiks un bloka izmÄrs, jo lielÄka ir blokÄ·Ädes caurlaidspÄja. Viens no otra tieÅ”i neizriet, taÄu jÄatceras, ka, lai panÄktu vienprÄtÄ«bu RAFT, ir nepiecieÅ”ami trÄ«s tÄ«kla pieprasÄ«jumi no vadÄ«tÄja lÄ«dz sekotÄjiem un atpakaļ. Jo vairÄk pasÅ«tÄ«juma mezglu, jo ilgÄks laiks bÅ«s nepiecieÅ”ams. Jo mazÄks ir bloka veidoÅ”anÄs lielums un laiks, jo vairÄk ir Å”Ädas mijiedarbÄ«bas. KÄ palielinÄt Ä£enerÄÅ”anas laiku un bloka izmÄru, nepalielinot sistÄmas reakcijas laiku gala lietotÄjam?
PirmkÄrt, mums ir kaut kÄ jÄatrisina MVCC konflikti, ko izraisa liels bloka izmÄrs, kas var ietvert dažÄdus RWSets ar vienu un to paÅ”u versiju. AcÄ«mredzot klienta pusÄ (attiecÄ«bÄ uz blokÄ·Ädes tÄ«klu tas varÄtu bÅ«t aizmugursistÄma, un es to domÄju) jums ir nepiecieÅ”ams MVCC konfliktu apstrÄdÄtÄjs, kas var bÅ«t vai nu atseviŔķs pakalpojums, vai parasts dekorators virs zvana, kas iniciÄ darÄ«jumu ar atkÄrtoÅ”anas loÄ£iku.
AtkÄrtot mÄÄ£inÄjumu var Ä«stenot ar eksponenciÄlu stratÄÄ£iju, taÄu tad latentums samazinÄsies tikpat eksponenciÄli. TÄpÄc jums vajadzÄtu izmantot vai nu randomizÄtu atkÄrtotu mÄÄ£inÄjumu noteiktos nelielos limitos, vai arÄ« pastÄvÄ«gu mÄÄ£inÄjumu. Ar aci uz iespÄjamÄm sadursmÄm pirmajÄ variantÄ.
NÄkamais solis ir padarÄ«t klienta mijiedarbÄ«bu ar sistÄmu asinhronu, lai tÄ negaidÄ«tu 15, 30 vai 10000000 sekundes, kuras mÄs iestatÄ«sim kÄ BatchTimeout. Bet tajÄ paÅ”Ä laikÄ ir jÄsaglabÄ iespÄja pÄrbaudÄ«t, vai darÄ«juma iniciÄtÄs izmaiÅas tiek/nav ierakstÄ«tas blokÄ·ÄdÄ.
DarÄ«juma statusa saglabÄÅ”anai var izmantot datu bÄzi. VienkÄrÅ”ÄkÄ iespÄja ir CouchDB, pateicoties tÄs lietoÅ”anas vienkÄrŔībai: datu bÄzei ir UI, REST API, un jÅ«s varat viegli iestatÄ«t tÄs replikÄciju un sadalÄ«Å”anu. Varat vienkÄrÅ”i izveidot atseviŔķu kolekciju tajÄ paÅ”Ä CouchDB instancÄ, kas izmanto Fabric, lai saglabÄtu savu pasaules stÄvokli. Mums ir jÄsaglabÄ Å”Äda veida dokumenti.
{
Status string // Š”ŃŠ°ŃŃŃ ŃŃŠ°Š½Š·Š°ŠŗŃŠøŠø: "pending", "done", "failed"
TxID: string // ID ŃŃŠ°Š½Š·Š°ŠŗŃŠøŠø
Error: string // optional, ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ Š¾Š± Š¾ŃŠøŠ±ŠŗŠµ
}
Å is dokuments tiek ierakstÄ«ts datu bÄzÄ pirms darÄ«juma nosÅ«tÄ«Å”anas vienaudžiem, entÄ«tijas ID tiek atgriezts lietotÄjam (tas pats ID tiek izmantots kÄ atslÄga), ja tÄ ir izveides darbÄ«ba, un pÄc tam tiek parÄdÄ«ti lauki Statuss, TxID un Error. atjauninÄta, tiklÄ«dz no vienaudžiem tiek saÅemta atbilstoÅ”a informÄcija.
Å ajÄ shÄmÄ lietotÄjs negaida, lÄ«dz beidzot izveidosies bloks, 10 sekundes vÄrojot ekrÄnÄ griežamo riteni, viÅÅ” saÅem tÅ«lÄ«tÄju atbildi no sistÄmas un turpina strÄdÄt.
MÄs izvÄlÄjÄmies BoltDB, lai saglabÄtu darÄ«jumu statusus, jo mums ir nepiecieÅ”ams ietaupÄ«t atmiÅu un nevÄlamies tÄrÄt laiku tÄ«kla mijiedarbÄ«bai ar atseviŔķu datu bÄzes serveri, it Ä«paÅ”i, ja Ŕī mijiedarbÄ«ba notiek, izmantojot vienkÄrÅ”a teksta protokolu. Starp citu, neatkarÄ«gi no tÄ, vai izmantojat CouchDB, lai ieviestu iepriekÅ” aprakstÄ«to shÄmu vai vienkÄrÅ”i saglabÄtu pasaules stÄvokli, jebkurÄ gadÄ«jumÄ ir lietderÄ«gi optimizÄt veidu, kÄ dati tiek glabÄti CouchDB. PÄc noklusÄjuma CouchDB b-koka mezglu izmÄrs ir 1279 baiti, kas ir daudz mazÄks par diska sektora izmÄru, kas nozÄ«mÄ, ka gan koka lasÄ«Å”anai, gan lÄ«dzsvaroÅ”anai bÅ«s nepiecieÅ”ama lielÄka fiziska piekļuve diskam. OptimÄlais izmÄrs atbilst standartam
Pretspiediens: bufera stratÄÄ£ija
TaÄu ziÅojumu var bÅ«t daudz. VairÄk, nekÄ sistÄma spÄj, koplietot resursus ar duci citu pakalpojumu, izÅemot diagrammÄ redzamos, un tam visam vajadzÄtu darboties nevainojami pat iekÄrtÄs, kurÄs Intellij Idea palaiÅ”ana bÅ«tu ÄrkÄrtÄ«gi nogurdinoÅ”a.
KomunikÄcijas sistÄmu, ražotÄja un patÄrÄtÄja, dažÄdu jaudu problÄma tiek risinÄta dažÄdos veidos. PaskatÄ«simies, ko mÄs varÄtu darÄ«t.
NomeÅ”ana: MÄs varam apgalvot, ka spÄjam apstrÄdÄt ne vairÄk kÄ X darÄ«jumus T sekundÄs. Visi pieprasÄ«jumi, kas pÄrsniedz Å”o ierobežojumu, tiek atmesti. Tas ir diezgan vienkÄrÅ”i, bet tad jÅ«s varat aizmirst par UX.
KontrolÄÅ”ana: patÄrÄtÄjam ir jÄbÅ«t kaut kÄdai saskarnei, caur kuru atkarÄ«bÄ no slodzes viÅÅ” var kontrolÄt ražotÄja TPS. Nav slikti, bet tas uzliek pienÄkumu klienta izstrÄdÄtÄjiem, kas veido slodzi, lai ieviestu Å”o saskarni. Tas mums ir nepieÅemami, jo blokÄ·Äde nÄkotnÄ tiks integrÄta daudzÄs jau sen pastÄvoÅ”Äs sistÄmÄs.
BuferÄÅ”ana: TÄ vietÄ, lai mÄÄ£inÄtu pretoties ievades datu straumei, mÄs varam buferÄt Å”o straumi un apstrÄdÄt to vajadzÄ«gajÄ ÄtrumÄ. AcÄ«mredzot tas ir labÄkais risinÄjums, ja vÄlamies nodroÅ”inÄt labu lietotÄja pieredzi. MÄs ieviesÄm buferi, izmantojot rindu RabbitMQ.
ShÄmai ir pievienotas divas jaunas darbÄ«bas: (1) pÄc API pieprasÄ«juma saÅemÅ”anas rindÄ tiek ievietots ziÅojums ar transakcijas izsaukÅ”anai nepiecieÅ”amajiem parametriem, un klients saÅem ziÅojumu, ka darÄ«jums ir pieÅemts sistÄma, (2) aizmugursistÄma nolasa datus ar Ätrumu, kas norÄdÄ«ts konfigurÄcijÄ no rindas; uzsÄk darÄ«jumu un atjaunina datus statusa krÄtuvÄ.
Tagad jÅ«s varat palielinÄt veidoÅ”anas laiku un bloÄ·Ät jaudu, cik vien vÄlaties, slÄpjot aizkavÄÅ”anos no lietotÄja.
Citi instrumenti
Å eit nekas netika teikts par Ä·Ädes kodu, jo, kÄ likums, tajÄ nav ko optimizÄt. ĶÄdes kodam jÄbÅ«t pÄc iespÄjas vienkÄrÅ”Äkam un droÅ”Äkam ā tas ir viss, kas no tÄ tiek prasÄ«ts. Ietvars palÄ«dz mums vienkÄrÅ”i un droÅ”i rakstÄ«t Ä·Ädes kodu
TurklÄt mÅ«su komanda izstrÄdÄ utilÄ«tu komplektu, lai padarÄ«tu darbu ar Fabric vienkÄrÅ”u un patÄ«kamu:
SecinÄjums
Å Ä« pieeja ļauj viegli nomainÄ«t Hyperledger Fabric ar Quorum, citiem privÄtajiem Ethereum tÄ«kliem (PoA vai pat PoW), ievÄrojami samazinÄt faktisko caurlaidspÄju, bet tajÄ paÅ”Ä laikÄ uzturÄt normÄlu UX (gan pÄrlÅ«kprogrammas lietotÄjiem, gan integrÄtajÄm sistÄmÄm). AizstÄjot Fabric ar Ethereum shÄmÄ, jums bÅ«s jÄmaina tikai atkÄrtota mÄÄ£inÄjuma pakalpojuma/dekoratora loÄ£ika no MVCC konfliktu apstrÄdes uz atomieroÄu palielinÄÅ”anu un atkÄrtotu nosÅ«tÄ«Å”anu. BuferizÄcija un statusa glabÄÅ”ana ļÄva atsaistÄ«t reakcijas laiku no bloka veidoÅ”anas laika. Tagad jÅ«s varat pievienot tÅ«kstoÅ”iem pasÅ«tÄ«juma mezglu un nebaidÄ«ties, ka bloki tiek veidoti pÄrÄk bieži un ielÄdÄt pasÅ«tÄ«Å”anas pakalpojumu.
BÅ«tÄ«bÄ tas ir viss, ar ko es gribÄju dalÄ«ties. PriecÄÅ”os, ja tas kÄdam palÄ«dzÄs darbÄ.
Avots: www.habr.com