3.12 Pensaernïaeth wedi’i gyrru gan ddigwyddiadau a negesu
Trosolwg a chymhelliant
Mae Pensaernïaeth wedi’i Gyrru gan Ddigwyddiadau (EDA) yn arddull lle mae cydrannau’n cyfathrebu drwy gynhyrchu ac ymateb i ddigwyddiadau yn hytrach na galw ei gilydd yn uniongyrchol. Mae digwyddiad yn ffaith: rhywbeth sydd eisoes wedi digwydd, fel “OrderPlaced” neu “PaymentCaptured”. Mae cynhyrchydd yn cyhoeddi’r ffaith ac yn symud ymlaen, ac mae unrhyw nifer o ddefnyddwyr yn ymateb yn ôl eu hamserlen eu hunain heb i’r cynhyrchydd wybod pwy sy’n gwrando. Mae hon yn ystum wahanol i’r galwadau cais-ac-ateb ym mhennod 2.3, lle mae galwr yn gofyn i wasanaeth penodol wneud rhywbeth ac yn aros am yr ateb.
I sefydliad mawr, y prif atyniad yw datgysylltu ar raddfa fawr. Pan fo gennych ddegau o dimau a channoedd o wasanaethau, mae gwifro popeth ynghyd â galwadau pwynt-i-bwynt uniongyrchol yn cynhyrchu gwe fregus lle mae newid un tîm yn torri gwaith tîm arall a neb yn gallu olrhain pam. Mae digwyddiadau’n galluogi timau i integreiddio drwy ffrwd gyffredin o ffeithiau yn lle drwy fewnolion ei gilydd, ac mae defnyddiwr newydd yn ymuno drwy danysgrifio, heb i’r cynhyrchydd newid un llinell o god. Y priodwedd hwnnw, yn fwy na thrwybwn crai, sy’n esbonio pam mae dulliau gyrru-gan-ddigwyddiadau’n parhau i ledaenu drwy fentrau sy’n disodli integreiddiadau cymhleth a llywodraethau sy’n cysylltu asiantaethau sydd bob un yn berchen ar eu systemau eu hunain.
Mae’r sector cyhoeddus yn cael budd arall sy’n hawdd ei danbrisio: mae cofnod parhaol, wedi’i drefnu, o’r hyn a ddigwyddodd yn ased archwilio a thryloywder. Pan fo dinesydd yn gofyn pam y daeth penderfyniad budd-dal allan fel y gwnaeth, mae log anghyfnewidiol o’r digwyddiadau a arweiniodd ato’n ateb yn uniongyrchol. Ond nid yw dylunio gyrru-gan-ddigwyddiadau’n rhad ac am ddim, ac nid yw bob amser yn iawn: mae llifau anghydamserol yn anos eu holrhain, yn anos rhesymu yn eu cylch, ac yn hawdd eu gorddefnyddio. Mae’r bennod hon yn farn bendant ynghylch pryd mae’r datgysylltu a’r raddfa’n talu am y cymhlethdod ychwanegol, a phryd byddai galwad gydamserol syml wedi’ch gwasanaethu’n well. Mae’n adeiladu ar realiti systemau dosbarthedig pennod 3.3, felly darllenwch honno gyntaf os nad ydych eisoes wedi gwneud.
Egwyddorion allweddol
- Ffeithiau yw digwyddiadau, nid cyfarwyddiadau. Mae digwyddiad yn dweud beth ddigwyddodd; mae gorchymyn yn gofyn i rywbeth ddigwydd. Cadwch nhw ar wahân, ac enwch ddigwyddiadau yn yr amser gorffennol.
- Datgysylltu yw’r pwynt. Ni ddylai cynhyrchwyr wybod nac boeni pwy sy’n defnyddio eu digwyddiadau. Os ydynt, mae gennych gyplu sy’n gwisgo gwisg negesu.
- Dyluniwch ar gyfer traddodi o leiaf unwaith. Mae traddodi’n union-unwaith yn chwedl. Gwnewch bob defnyddiwr yn idempotent fel bod dyblygiadau’n ddiniwed.
- Mae trefn yn warant y talwch amdani. Cewch drefn o fewn rhaniad, nid ar draws pwnc cyfan. Dewiswch allweddi rhaniad yn fwriadol.
- Y sgema yw’r cytundeb. Mae siâp digwyddiad yn rhyngwyneb cyhoeddus; datblygwch ef â’r gofal a roddech i API cyhoeddedig.
- Nid yw anghydamserol yn golygu na ellir ei arsylwi. Os na allwch ddilyn neges o’r dechrau i’r diwedd, ni allwch weithredu’r system.
- Rhaid ennill cymhlethdod. Mae event sourcing, CQRS, a sagas yn bwerus ac yn gostus; estynnwch amdanynt pan fo’r broblem yn eu mynnu, nid yn ddiofyn.
Argymhellion
Gwahaniaethwch rhwng digwyddiadau, gorchmynion, a negeseuon cyn i chi adeiladu dim
Defnyddir y tri gair hyn yn gyfnewidiol, ac mae’r dryswch yn achosi camgymeriadau dylunio gwirioneddol. Mae gorchymyn yn gais i wneud rhywbeth (“CapturePayment”), wedi’i gyfeirio at un trinydd, a gellir ei wrthod. Mae digwyddiad yn hysbysiad bod rhywbeth eisoes wedi digwydd (“PaymentCaptured”), wedi’i ddarlledu i unrhyw un sydd â diddordeb, ac ni ellir ei wrthod gan fod y ffaith eisoes yn wir. Mae neges yn amlen niwtral sy’n cludo’r naill neu’r llall dros y wifren. Mae’r gwahaniaeth yn siapio cyplu: mae gorchmynion yn cyplu’r anfonwr i dderbynnydd a chanlyniad penodol, tra bo digwyddiadau’n ildio rheolaeth dros yr hyn sy’n digwydd nesaf. Enwch eich digwyddiadau yn yr amser gorffennol, a phan ddaliwch eich hun yn cyhoeddi “digwyddiad” sydd mewn gwirionedd yn golygu “ewch i wneud y peth penodol hwn os gwelwch yn dda”, rydych wedi ysgrifennu gorchymyn dan gochl.
Dewiswch giwiau, logiau, a chyhoeddi/tanysgrifio yn fwriadol
Nid yr un siâp yw pob math o negesu, ac mae dewis yr un anghywir yn gamgymeriad cynnar cyffredin. Mae ciw negeseuon yn traddodi pob neges i un defnyddiwr ac fel arfer yn ei dileu unwaith y’i prosesir, sy’n gweddu i ddosbarthu gwaith: llawer o weithwyr yn tynnu tasgau, pob un wedi’i wneud unwaith. Mae log digwyddiadau parhaol (ffrwd) yn cadw digwyddiadau mewn trefn ac yn caniatáu i lawer o ddefnyddwyr annibynnol ddarllen ar eu cyflymder eu hunain, gan ailchwarae hanes o unrhyw bwynt, sy’n gweddu i ddosbarthu digwyddiadau ac archwilio. Mae cyhoeddi/tanysgrifio yn golygu bod cynhyrchwyr yn cyhoeddi i bwnc a bod sawl tanysgrifiwr yn cael copi ei hun bob un. Y rheol ymarferol: os yw’r neges yn dasg y dylai un gweithiwr ei chwblhau, estynnwch am giw; os yw’n ffaith y gall llawer o bartïon boeni yn ei chylch nawr neu yn y dyfodol, estynnwch am log parhaol, sydd hefyd yn rhoi ailchwarae i chi ar gyfer adfer a chyflwyno defnyddwyr newydd. Gweler pennod 3.4 am sut mae’r dewisiadau hyn yn rhyngweithio â’ch strategaeth storio data.
Ffafriwch choreography ar gyfer ymreolaeth, orchestration ar gyfer rheolaeth
Pan fo proses fusnes yn rhychwantu sawl gwasanaeth, gallwch ei chydgysylltu mewn un o ddwy ffordd. Mewn choreography, mae pob gwasanaeth yn ymateb i ddigwyddiadau ac yn allyrru ei rai ei hun, heb ymennydd canolog: y datgysylltiad mwyaf posibl a da ar gyfer ymreolaeth timau, ond nid yw’r broses gyfan yn bodoli ond fel ymddygiad sy’n dod i’r amlwg, na all unrhyw un lle unigol ei ddisgrifio. Mewn orchestration, mae cydgysylltydd canolog yn gyrru’r camau ac yn gwybod y llif cyfan: haws ei fonitro a’i addasu, ar draul cydran y mae pob cam yn dibynnu arni. Diofyn da yw choreography ar gyfer ymatebion sy’n gysylltiedig yn llac (“pan fo archeb yn cael ei hanfon, mae’r gwasanaeth teyrngarwch yn dyfarnu pwyntiau”) ac orchestration ar gyfer trafodiad diffiniedig gyda chyflwr llwyddiant clir ac angen adrodd statws. Peidiwch â gadael i broses bwysig fyw dim ond fel gwybodaeth lwythol wedi’i gwasgaru ar draws deg o drinyddion digwyddiadau.
Estynnwch am event sourcing a CQRS dim ond pan fyddant yn ennill eu lle
Mae event sourcing yn storio cyflwr fel dilyniant o ddigwyddiadau na ellir ond ychwanegu ato, yn hytrach na chipolwg cyfredol rydych yn ei drosysgrifo, ac rydych yn ailadeiladu’r cyflwr cyfredol drwy eu hailchwarae. Y fantais yw llwybr archwilio perffaith, y gallu i ailadeiladu unrhyw gyflwr blaenorol, ac ymholiadau amserol; y gost yw eich bod yn fersiynu sgemâu digwyddiadau am byth, yn trin ailchwarae a chipluniau, ac yn cario model meddyliol nad yw’r rhan fwyaf o ddatblygwyr erioed wedi’i ddefnyddio. Mae CQRS (Command Query Responsibility Segregation) yn gwahanu’r model ysgrifennu oddi wrth un model darllen neu fwy fel bod darllen ac ysgrifennu’n graddio ac yn datblygu’n annibynnol; mae’n paru’n naturiol ag event sourcing ond nid yw’n ei fynnu. Mae’r ddau’n serennu ar gyfer meysydd sydd ag angen gwirioneddol am archwilio, cydymffurfiaeth, neu ymholiadau cymhleth, a dyna pam mae cyllid a llywodraeth reoleiddiedig yn eu cael yn werth y drafferth. Ar gyfer gwasanaeth creu-darllen-diweddaru-dileu syml, maent yn gymhlethdod damweiniol y byddwch yn ei ddifaru, felly defnyddiwch nhw ar y sleisen o’ch maes sydd eu hangen, nid y system gyfan drwy adwaith reddfol.
Rheolwch drafodion dosbarthedig gyda sagas, nid two-phase commit
Fel arfer, ni allwch lapio un trafodiad atomig o amgylch sawl gwasanaeth a chronfa ddata. Mae two-phase commit dosbarthedig yn dal cloeon ar draws y rhwydwaith, yn torri argaeledd, ac yn graddio’n wael, felly’n anaml y mae’n gweddu i system wedi’i gyrru gan ddigwyddiadau. Mae’r patrwm saga yn ei ddisodli: modelwch y trafodiad fel dilyniant o drafodion lleol, pob un yn allyrru digwyddiad sy’n sbarduno’r nesaf, a rhowch i bob cam weithred iawndal sy’n ei ddadwneud os bydd cam diweddarach yn methu. Os yw “cadw stoc” yn llwyddo ond “codi tâl ar gerdyn” yn methu, mae iawndal yn rhyddhau’r stoc. Gellir defnyddio choreography neu orchestration ar gyfer sagas, ac mae orchestration fel arfer yn ennill ar gyfer unrhyw beth y mae’n rhaid i chi ei fonitro. Am fod sagas yn cofleidio cysondeb eventual, mae’r system yn mynd drwy gyflyrau canolradd (“wedi’i gadw ond heb ei dalu”) cyn iddi gydgyfeirio, felly dyluniwch eich profiad defnyddiwr a’ch llwybr archwilio i ddangos cyflyrau “ar y gweill” a “wedi’i iawndalu” yn onest. Mae pennod 3.3 yn ymdrin â’r un tir hwn o safbwynt systemau dosbarthedig.
Dyluniwch ar gyfer traddodi o leiaf unwaith a gwnewch ddefnyddwyr yn idempotent
Ni all systemau negesu draddodi’n union-unwaith mewn gwirionedd ar draws methiannau, oherwydd gall y gydnabyddiaeth sy’n dweud “rwyf wedi prosesu hwn” ei hun fynd ar goll, gan orfodi ail-draddodi. Yr hyn y gallwch ei gyflawni yw traddodi o leiaf unwaith gyda phrosesu idempotent, sy’n cynhyrchu effeithiau union-unwaith. Mae idempotence yn golygu bod prosesu’r un digwyddiad ddwywaith yn gadael yr un canlyniad â’i brosesu unwaith; cyrhaeddwch hynny gydag allwedd idempotency ar bob digwyddiad a chofnod o’r hyn rydych eisoes wedi’i drin, fel bod dyblyg yn cael ei adnabod a’i ollwng. Mae traddodi at-most-once (tanio ac anghofio, dim ail-draddodi) yn symlach ond yn colli negeseuon yn dawel, felly cadwch ef ar gyfer data y gallwch fforddio ei golli. Trinwch y label “union-unwaith” y mae rhai gwerthwyr yn ei hysbysebu â drwgdybiaeth: fel arfer mae’n golygu union-unwaith o fewn ffin un system o dan amodau penodol, nid y warant o’r naill ben i’r llall y mae’r ymadrodd yn ei awgrymu.
Rheolwch drefn gyda rhaniadau, a byddwch yn gyfarwydd â’ch grwpiau defnyddwyr
Nid yw trefn yn fyd-eang nac am ddim; mae’n lleol ac yn cael ei thalu amdani. Mae ffrwd yn cael ei rhannu’n raniadau, a chewch drefn o fewn rhaniad, nid ar draws y pwnc cyfan. Mae digwyddiadau’n cael eu llwybro i raniad gan allwedd raniad, felly dewis yr allwedd honno yw sut rydych yn rheoli beth sy’n aros mewn trefn: allweddwch yn ôl ID cwsmer ac mae digwyddiadau un cwsmer yn aros mewn trefn o’u cymharu â’i gilydd, tra bo cwsmeriaid gwahanol yn prosesu’n gyfochrog. Mae grwpiau defnyddwyr yn caniatáu i set o weithwyr rannu rhaniadau pwnc, gyda phob rhaniad yn cael ei drin gan un gweithiwr, sef sut rydych yn graddio trwybwn wrth gadw trefn fesul rhaniad; dyma lle mae graddadwyedd yn cwrdd â chywirdeb, gan gysylltu â phennod 3.5. Dewiswch allwedd raniad sy’n adlewyrchu eich gwir ofyniad trefn ac yn lledaenu llwyth yn gyfartal, oherwydd mae allwedd sy’n sianelu’r rhan fwyaf o’r traffig i un rhaniad yn creu man poeth na all unrhyw nifer o weithwyr ei liniaru.
Trinwch sgemâu fel cytundebau gyda chofrestrfa a rheolau esblygiad
Mae strwythur digwyddiad yn rhyngwyneb cyhoeddedig y mae timau na fyddwch efallai byth yn eu cyfarfod yn ei ddefnyddio, felly mae ei newid yn ddiofal yn eu torri o bell. Rhowch eich sgemâu digwyddiadau mewn cofrestrfa sgemâu, catalog a rennir sy’n storio pob sgema ac yn gorfodi rheolau cydnawsedd pan fo cynhyrchydd yn ceisio newid un. Mabwysiadwch bolisi eglur: caniateir newidiadau sy’n gydnaws yn ôl-weithredol (ychwanegu maes dewisol); mae newidiadau sy’n torri pethau (dileu maes, newid math, ailenwi) yn gofyn am fersiwn sgema newydd a chynllun mudo. Mae hyn yn caniatáu i gynhyrchwyr esblygu heb ddefnydd cydamserol ar draws pob defnyddiwr, sef union y rheswm y dewisoch ddigwyddiadau yn y lle cyntaf. Mae’r un ddisgyblaeth fersiynu rhyngwyneb o bennod 2.3 yn berthnasol, gan mai API dan enw arall yw sgema digwyddiad.
Gwarantwch draddodi gyda’r transactional outbox, a thriniwch fethiannau’n benodol
Nam clasurol: mae eich gwasanaeth yn ysgrifennu i’w gronfa ddata ac yna’n cyhoeddi digwyddiad, ac mae’n chwalu rhwng y ddau gam, felly newidiodd y gronfa ddata ond ni aeth y digwyddiad allan byth. Mae’r transactional outbox yn trwsio hyn drwy ysgrifennu’r digwyddiad i mewn i dabl outbox yn yr un trafodiad cronfa ddata â’r newid cyflwr, fel eu bod yn cyflawni neu’n methu gyda’i gilydd; mae relái ar wahân wedyn yn darllen yr outbox ac yn cyhoeddi i’r broceriaeth, gan ddefnyddio change data capture yn aml i ddilyn log y gronfa ddata. Ar gyfer methiannau defnydd, mae dead letter queue yn dal negeseuon sy’n methu dro ar ôl tro fel nad yw neges wenwynig (un na fydd byth yn llwyddo, o bosibl am ei bod wedi’i chamffurfio) yn blocio’r ciw y tu ôl iddi am byth. Ychwanegwch backpressure fel na all cynhyrchydd cyflym lethu defnyddiwr araf: cyfyngwch eich ciwiau, ac arafwch neu ollyngwch lwyth pan fyddant yn llenwi yn hytrach na disbyddu cof. Mae’r pedwar mecanwaith hyn yn gwahaniaethu rhwng demo a system y gallwch ei rhedeg am 3 y bore.
Gwnewch lifau anghydamserol yn arsylladwy o’r dechrau i’r diwedd
Y gost anoddaf o fynd yn gyrru-gan-ddigwyddiadau yw bod un weithred fusnes bellach yn gwasgaru ar draws cynhyrchwyr, brocwyr, a defnyddwyr heb bentwr galwadau’n eu clymu ynghyd. Lledaenwch ID cydberthynas drwy bob digwyddiad fel y gallwch ddilyn un llif rhesymegol ar draws pob naid, yr un ddisgyblaeth y mae pennod 3.3 yn ei phennu ar gyfer galwadau cydamserol. Trac oediad defnyddiwr (pa mor bell y tu ôl i amser real y mae pob defnyddiwr yn darllen) fel metrig dosbarth cyntaf, oherwydd mae oediad cynyddol yn rhybudd cynharaf o drafferth, a monitrwch ddyfnder ciw llythyrau marw, oedi prosesu, a chyfraddau ail-draddodi. Heb hyn, mae digwyddiad sy’n methu’n dawel â chael ei ddefnyddio’n dod yn nam anweledig sy’n dod i’r amlwg ddyddiau’n ddiweddarach fel data coll.
Cyfaddawdau: manteision ac anfanteision
| Dull | Manteision | Anfanteision / cost |
|---|---|---|
| Cais/ateb cydamserol | Syml i resymu yn ei gylch, canlyniad ar unwaith, olrhain hawdd | Cyplu amserol tynn, methiannau’n rhaeadru, graddfa gyfyngedig |
| Gyrru-gan-ddigwyddiadau (pub/sub dros log) | Datgysylltu, graddio annibynnol, ailchwarae, llwybr archwilio | Cysondeb eventual, olrhain anoddach, mwy o rannau symudol |
| Ciw negeseuon (dosbarthu gwaith) | Lefelu llwyth, byffro, cyfeillgar i backpressure | Un defnyddiwr fesul neges, llai addas i ddarlledu |
| Event sourcing + CQRS | Hanes llawn, ymholiadau amserol, darllen/ysgrifennu’n graddio’n annibynnol | Fersiynu sgemâu am byth, cymhlethdod ailchwarae, tro dysgu serth |
| Saga (yn erbyn two-phase commit) | Graddadwy, ar gael, dim cloeon dosbarthedig | Cysondeb eventual, rhesymeg iawndal, anoddach rhesymu yn ei gylch |
Y tyndra canolog yw rhwng datgysylltu a dealladwyedd. Mae pob digwyddiad a ychwanegwch yn llacio’r cyplu rhwng cynhyrchydd a defnyddiwr, gan brynu ymreolaeth tîm a graddio annibynnol, ac ar yr un pryd mae’n dileu llinell o’r stori y byddai galwad gydamserol wedi’i dweud wrthych yn eglur: mae’r llif yn dod yn ddigymell, yn byw yn y rhyngweithiadau yn hytrach nag mewn unrhyw un ffeil. Datryswch hyn drwy fod yn ddetholus: defnyddiwch ddigwyddiadau lle mae datgysylltu wir yn talu ar ei ganfed, fel integreiddio ar draws ffiniau timau, ymledu i lawer o ddefnyddwyr, byffro pigau llwyth, ac archwilio. Cadwch alwadau cydamserol lle mae angen ateb ar unwaith arnoch a model meddyliol syml, fel darllen data i beri i dudalen ymddangos. Y modd methiant i’w osgoi yw troi pob galwad ffwythiant fewnol yn ddigwyddiad a’i alw’n bensaernïaeth, yr un farn bensaernïol y mae pennod 3.2 yn gofyn amdani ar gyfer pob patrwm rydych yn ei fabwysiadu.
Cwestiynau i’w trafod gyda’ch tîm
Ar gyfer y rhyngweithiad penodol hwn, a oes wir angen digwyddiad arnom, neu a fyddai galwad gydamserol yn gliriach ac yn fwy diogel? Trwy hepgor y cwestiwn hwn y mae system yn casglu cymhlethdod damweiniol. Y prawf gonest yw a oes angen canlyniad yn ôl ar unwaith ar y cynhyrchydd (galwad) neu a yw’n cyhoeddi ffaith y gall eraill ymateb iddi yn eu hamser eu hunain (digwyddiad). Dewch â’r rhyngweithiad penodol, nid dewisiad cyffredinol, a gofynnwch pa ddatgysylltu a enillwch a pha eglurder olrhain a ildiwch. Os yw’r galwr yn blocio wrth aros i’r “digwyddiad” gael ei brosesu, rydych wedi adeiladu galwad gydamserol araf, anodd ei dadfygio, ac wedi talu’n ychwanegol am y fraint. Y diofyn ar gyfer rhyngweithiadau mewnol, o fewn yr un tîm, sydd angen ateb nawr, ddylai fod galwad uniongyrchol; cadwch ddigwyddiadau ar gyfer lle mae’r cyplu llac yn ennill ei gost.
Beth sy’n digwydd pan fo defnyddiwr yn derbyn yr un digwyddiad ddwywaith, ac a ydym wedi profi hynny mewn gwirionedd? Mae traddodi o leiaf unwaith yn gwarantu y bydd dyblygiadau’n digwydd, felly rhaid i bob defnyddiwr fod yn idempotent, ac eto mae’n hawdd honni idempotency a hawdd ei gael yn anghywir. Ewch drwy ddefnyddiwr go iawn ac olrheiniwch yn union sut mae ail draddodiad yn cael ei adnabod a’i niwtraleiddio, boed hynny drwy allwedd idempotency, log digwyddiadau-wedi’u-prosesu, neu weithrediad sy’n naturiol idempotent. Dewch â chanlyniadau prawf gwirioneddol lle rydych yn ail-draddodi swp ac yn cadarnhau nad oes taliadau dwbl, cofnodion dyblyg, na hysbysiadau wedi’u hailadrodd. Rhowch sylw arbennig i sgil-effeithiau sy’n gadael eich cronfa ddata, fel e-byst, taliadau, a galwadau trydydd parti, oherwydd dyna lle mae namau nad ydynt yn idempotent yn niweidio cwsmeriaid yn uniongyrchol. Os na all eich tîm bwyntio at brawf sy’n profi diogelwch rhag dyblygu, tybiwch nad ydych yn ddiogel rhag dyblygu.
Pan fo llif digwyddiadau’n torri mewn cynhyrchiad, pa mor hir cyn i ni sylwi, ac a allwn olrhain un neges o’r dechrau i’r diwedd? Mae methiannau anghydamserol yn dawel, felly gall defnyddiwr sy’n stopio prosesu’n dawel fynd heb ei sylwi nes bod data coll yn dod yn gŵyn cwsmer neu’n fwlch archwilio. Gofynnwch beth yw eich signal cynharaf, ac a ydych yn monitro oediad defnyddiwr a dyfnder ciw llythyrau marw fel metrigau rhybuddio yn hytrach na dangosfyrddau nad oes neb yn eu gwylio. Dewch â digwyddiad go iawn neu ymarfer diwrnod-gêm ac amserwch pa mor hir mae’n ei gymryd i ddilyn un ID cydberthynas ar draws cynhyrchydd, broceriaeth, a phob defnyddiwr. Os yw’r ateb yn “rydym yn grep sawl gwasanaeth ac yn dyfalu”, nid yw eich arsylladwyedd yn barod ar gyfer y cymhlethdod rydych wedi’i gymryd ymlaen. Mewn sectorau rheoleiddiedig, mae’r gallu i ailadeiladu union sut y symudodd neges yn aml yn ofyniad cydymffurfiaeth, nid yn foethusrwydd.
Sut y byddwn yn esblygu sgema digwyddiad y mae llawer o dimau eisoes yn ei ddefnyddio heb dorri unrhyw un ohonynt? Mae siâp digwyddiad yn gytundeb cyhoeddus, ac unwaith y mae degau o ddefnyddwyr yn dibynnu arno, gall newid sy’n edrych yn ddiniwed dorri systemau na chlywsoch amdanynt erioed, o bell, heb grynhorydd i’ch rhybuddio. Mae’r tyndra’n wirioneddol: mae cynhyrchwyr am symud yn gyflym a glanhau eu digwyddiadau, tra bo pob defnyddiwr am i’r siâp gael ei rewi am byth, felly cytunwch ymlaen llaw pa newidiadau sy’n ddiogel (ychwanegu maes dewisol) a pha rai sy’n mynnu fersiwn newydd a ffenestr mudo (dileu maes, newid math, ailenwi). Dewch â’r rhestr wirioneddol o ddefnyddwyr fesul pwnc, boed cofrestrfa sgemâu’n gorfodi rheolau cydnawsedd heddiw neu a yw siapiau’n newid drwy gytundeb anffurfiol, a pha mor hir y gall dau fersiwn redeg ochr yn ochr yn ystod mudo. Mewn menter fawr neu drefniant rhannu data llywodraethol ar draws asiantaethau, gall sgema sydd wedi torri’n dawel lygru cofnodion mewn systemau nad ydych yn berchen arnynt a dod i’r amlwg yn ddiweddarach fel methiant archwilio, felly trinwch orfodi cydnawsedd fel llywodraethu, nid cwrteisi.
Ar gyfer ein trafodiad aml-wasanaeth pwysicaf, beth yn union y mae pob gweithred iawndal yn ei ddadwneud, a pha gyflyrau canolradd y bydd defnyddwyr ac archwilwyr yn eu gweld? Mae sagas yn cyfnewid rhith cysurus un trafodiad atomig am ddilyniant o gamau lleol y gall pob un ohonynt fethu, felly mae’r system yn wirioneddol yn mynd drwy gyflyrau fel “wedi’i gadw ond heb ei dalu” a “wedi codi tâl ond heb ei anfon” cyn iddi gydgyfeirio, a smalio fel arall yw sut rydych yn cyhoeddi saga sy’n gollwng arian neu’n amddifadu cofnodion. Ewch drwy’r broses go iawn o’r dechrau i’r diwedd, enwch yr iawndal ar gyfer pob cam (beth sy’n rhyddhau’r stoc, beth sy’n ad-dalu’r cerdyn), a phenderfynwch a yw saga wedi’i threfnu y gallwch ei monitro’n well na choreograffi digymell na all unrhyw un lle unigol ei ddisgrifio. Dewch â’r achosion methiant rydych wedi’u profi mewn gwirionedd, nid y llwybr hapus, a chadarnhewch fod y profiad defnyddiwr a’r llwybr archwilio’n dangos cyflyrau “ar y gweill” a “wedi’i iawndalu” yn onest yn hytrach na’u cuddio. Mewn systemau cyllid, budd-daliadau, neu drethi, bydd rheoleiddiwr yn gofyn sut olwg oedd ar y cofnod ar bob eiliad ganolradd a phwy oedd yn atebol am yr iawndal, felly mae cyflyrau’r saga eu hunain yn arteffact cydymffurfiaeth.
Pwy sy’n rhedeg y broceriaeth neu’r log digwyddiadau, ac a ydym wedi cyfrif gwir gost ei weithredu yn erbyn dewis arall a reolir? Nid yw’r asgwrn cefn negesu’n seilwaith am ddim sy’n ymddangos unwaith y byddwch yn ei dynnu ar ddiagram: mae rhywun yn ei glytio, yn graddio ei raniadau, yn tiwnio cadw-data, yn ymateb pan fydd yn pagio am 3 y bore, ac yn berchen ar ei gapasiti a’i foddau methiant. Penderfynwch yn fwriadol rhwng hunanletya broceriaeth cod agored a phrynu gwasanaeth a reolir, gan bwyso rheolaeth a phreswyliad data yn erbyn y baich gweithredol a chost trwyddedu, a byddwch yn onest ynghylch a oes gan eich tîm y dyfnder i redeg log dosbarthedig yn dda. Dewch â chyfanswm cost perchnogaeth: llwyth ar-alwad, y sgiliau arbenigol sydd eu hangen, y bil cadw-data a storio, a beth mae toriad broceriaeth yn ei wneud i bob llif dibynnol. I fenter, mae’r ateb yn siapio mandad tîm platfform, ac i gorff llywodraethol gall rheolau caffael, gofynion sofraniaeth data, ac angen caled i osgoi clymu i werthwr drechu’r dewis rhataf, felly dygwch y cyfyngiadau hynny i’r amlwg cyn ymrwymo i dechnoleg y byddwch yn ei rhedeg am ddegawd.
Lens sector
Startup. Eich adnodd prinnaf yw sylw peirianneg, felly arhoswch yn gydamserol nes bod ymledu wir yn brifo. Pan fo angen i dri pheth ymateb i un weithred, cyhoeddwch un digwyddiad (fel “OrderPlaced”) i giw neu log a reolir yn hytrach na sefydlu clwstwr broceriaeth eich hun, a chadwch daliadau ac unrhyw beth y mae angen ateb ar unwaith ohono fel galwad uniongyrchol. Peidiwch â mabwysiadu event sourcing, CQRS, na sagas i edrych yn soffistigedig; bydd y cymhlethdod hwnnw’n rhagori ar dîm bach ac yn arafu’r union ailadrodd rydych yn cystadlu arno.
Busnes bach. Nid oes gennych arbenigwr negesu na blas ar redeg Kafka, felly triniwch integreiddio anghydamserol fel rhywbeth rydych yn ei brynu, nid ei weithredu. Pwyswch ar y digwyddiadau y mae eich offer presennol eisoes yn eu hallyrru (webhooks, y ciwiau sydd wedi’u hadeiladu i mewn i’ch darparwr cwmwl neu lwyfannau SaaS) a gadewch i wasanaeth a reolir fod yn berchen ar y plymwaith traddodi, cadw-data, ac idempotency. Fframiwch y dewis fel prynu-yn-erbyn-adeiladu yn onest: mae llond llaw o drinyddion webhook dibynadwy yn curo broceriaeth bwrpasol na allwch ei staffio na’i dadfygio am 3 y bore.
Menter. Eich problem yw cost integreiddio ar draws llawer o dimau, felly’r enillion yw platfform a rennir sy’n cael ei lywodraethu: log digwyddiadau parhaol, cofrestrfa sgemâu gyda pholisi cydnawsedd wedi’i orfodi, perchnogaeth pwnc glir, a phatrymau idempotency ac outbox safonol fel nad yw pob tîm yn ailddyfeisio’r olwyn. Dyma’r cyd-destun lle mae disodli bws gwasanaeth menter (ESB) bregus neu we o gysylltiadau pwynt-i-bwynt yn cyfansymu’n arbedion gwirioneddol, a lle mae sagas wedi’u trefnu gyda statws gweladwy’n galluogi staff gweithrediadau i reoli prosesau aml-gam. Cyllidebwch y buddsoddiad arsylladwyedd a llywodraethu sgemâu yn benodol, oherwydd ar y raddfa hon mae methiant defnyddiwr tawel yn dod yn ddata coll ar draws degau o systemau.
Llywodraeth. Mae log digwyddiadau parhaol, wedi’i drefnu, yn ased archwilio a thryloywder: mae’n ateb “pam y daeth y penderfyniad hwn allan fel hyn” gyda dilyniant anghyfnewidiol o ffeithiau, felly pwyswch i mewn i event sourcing lle mae atebolrwydd yn ei fynnu. Mae angen i rannu data rhwng asiantaethau gael traddodi o leiaf unwaith gyda dad-ddyblygu ar ID digwyddiad sefydlog fel nad yw cofnod sydd wedi’i ail-draddodi byth yn creu achos dyblyg, a dylai caffael bwyso sofraniaeth data, datgeliad cyfyngiadau broceriaeth, a chludadwyedd yn erbyn clymu i werthwr. Cyhoeddwch, lle bo’n briodol, sut mae’r llif yn gweithio a sut y gall dinesydd herio canlyniad awtomataidd, a chadwch y log digwyddiadau fel y cofnod amddiffynadwy y bydd cyrff trosolwg yn gofyn i’w archwilio.
Enghreifftiau
Startup. Mae startup e-fasnach fach yn dechrau gydag un llif cydamserol: mae’r ddesg dalu’n galw’r gwasanaeth taliadau ac yn aros. Wrth iddi dyfu, mae am gael e-byst cadarnhau archebion, diweddariadau stoc, a rhaglen deyrngarwch yn ymateb i bryniannau, ac mae gwifro pob un fel galwad gydamserol arall y tu mewn i’r ddesg dalu’n gwneud y ddesg dalu’n araf ac yn fregus. Mae’r tîm yn cyhoeddi un digwyddiad “OrderPlaced” i log parhaol ac yn gadael i dri defnyddiwr annibynnol ymateb, felly mae’r ddesg dalu’n gyflym eto ac nid oes angen unrhyw newid iddi wrth ychwanegu pedwerydd ymateb yn ddiweddarach. Maent yn cadw dal taliadau’n gydamserol, oherwydd bod angen yr ateb ie-neu-na arnynt cyn cadarnhau’r archeb, sef union y llinell gywir i’w thynnu ar eu maint hwy.
Menter. Mae yswiriwr byd-eang yn boddi mewn integreiddiadau pwynt-i-bwynt a bws gwasanaeth menter (ESB) heneiddiol, hyb canolog y mae pob system yn llwybro drwyddo ac sydd wedi dod yn dagfa ac yn un pwynt methiant. Mae’n mudo i log digwyddiadau parhaol lle mae pob maes yn cyhoeddi ei ffeithiau (polisi wedi’i gyhoeddi, hawliad wedi’i gyflwyno, taliad wedi’i wneud) a thimau defnyddio’n tanysgrifio i’r hyn sydd ei angen arnynt. Mae saga hawliadau, wedi’i threfnu fel y gall staff gweithrediadau weld statws pob hawliad, yn cydgysylltu’r setliad aml-gam gydag iawndaliadau ar gyfer camau sy’n methu. Mae cofrestrfa sgemâu’n galluogi’r tîm polisïau i esblygu eu digwyddiadau heb ddefnydd cydamserol ar draws deugain o systemau defnyddio, yn union y bregusrwydd a orfododd yr hen ESB.
Llywodraeth. Rhaid i asiantaeth drethi genedlaethol roi ateb amddiffynadwy i ddinasyddion ac archwilwyr i “pam y daeth fy asesiad allan fel hyn”. Mae’n modelu maes yr asesiad gydag event sourcing, fel bod pob newid yn ddigwyddiad anghyfnewidiol mewn log wedi’i drefnu a bod yr asesiad cyfredol yn ailchwarae o’r digwyddiadau hynny; pan fo dinesydd yn anghytuno â ffigwr, mae gweithiwr achos yn ailadeiladu’r cyflwr union ar unrhyw ddyddiad blaenorol ac yn dangos y dilyniant ffeithiau a’i cynhyrchodd. Mae rhannu data rhwng asiantaethau’n rhedeg dros bynciau parhaol gyda thraddodi o leiaf unwaith, ac mae defnyddiwr pob asiantaeth yn dad-ddyblygu ar ID digwyddiad fel nad yw cofnod sydd wedi’i ail-draddodi byth yn creu achos dyblyg. Mae’r log digwyddiadau’n dyblu fel y llwybr archwilio y mae cyrff trosolwg yn ei fynnu, gan droi rhwymedigaeth gydymffurfiaeth yn sgil-gynnyrch y dyluniad.
Achos busnes: cymhellion, ROI, a TCO
Mae’r enillion ar bensaernïaeth gyrru-gan-ddigwyddiadau’n cael eu dominyddu gan un peth: cost integreiddio dros amser. Mae integreiddio pwynt-i-bwynt yn gwneud i’r gost honno dyfu gyda nifer y cysylltiadau, sy’n tyfu’n gyflymach na nifer y systemau, felly mae integreiddio’n dod yn dreth sy’n bwyta eich capasiti traddodi. Mae digwyddiadau’n gwastatáu hyn, oherwydd bod timau’n integreiddio drwy ffrwd gyffredin o ffeithiau, mae defnyddiwr newydd yn ymuno drwy danysgrifio, ac mae cynhyrchwyr yn esblygu y tu ôl i sgema wedi’i fersiynu, felly mae cost ymylol yr integreiddiad nesaf yn gostwng yn sylweddol. Dyna’r stori ROI graidd i’w hadrodd wrth arweinyddiaeth: nid perfformiad crai, ond y gostyngiad cyfansymol yng nghost newid ar draws llawer o dimau.
Enwch gyfanswm cost perchnogaeth yn onest fel y’ch coelir. Rydych yn cymryd ymlaen seilwaith broceriaeth i’w redeg, llywodraethu sgemâu i’w gynnal, a thro dysgu gweithredol serthach, oherwydd bod systemau anghydamserol wir yn anos eu dadfygio, felly cyllidebwch ar gyfer y buddsoddiad arsylladwyedd ymlaen llaw. Pwyswch y rhain yn erbyn cost peidio â mabwysiadu digwyddiadau lle maent yn gweddu: haen integreiddio wedi caledu lle mae pob newid yn brosiect cydgysylltu aml-dîm, hen ESB sydd wedi dod yn dagfa nad oes neb yn meiddio ei chyffwrdd, ac anallu i ychwanegu galluoedd heb aflonyddu ar rai hen. I’r fenter sy’n disodli gwifro pwynt-i-bwynt bregus a’r llywodraeth sy’n adeiladu llwybrau archwilio parhaol, mae’r enillion gryfaf lle mae’r anghenion archwilio a datgysylltu’n wirioneddol. Lle mae’r anghenion hynny’n absennol, yr ateb gonest yw bod gan ddyluniad cydamserol symlach TCO is, a dylech ddweud hynny.
Gwrthbatrymau a pheryglon
- Yr undoll dosbarthedig dan gochl. Gwasanaethau sy’n gorfod defnyddio gyda’i gilydd a dibynnu ar ddigwyddiadau mewnol ei gilydd. Rydych wedi ychwanegu broceriaeth ond wedi cadw’r cyplu, felly mae gennych anfanteision y ddau arddull.
- Digwyddiadau fel gorchmynion. Cyhoeddi “digwyddiadau” sydd mewn gwirionedd yn golygu “gwnewch y peth penodol hwn i mi os gwelwch yn dda”, gan ail-greu cyplu tynn gydag oedi ychwanegol ac olrheinadwyedd gwaeth.
- Cymryd yn ganiataol draddodi union-unwaith. Defnyddwyr sy’n torri, yn codi tâl ddwywaith, neu’n dyblygu cofnodion pan fo’r broceriaeth yn anochel yn ail-draddodi neges.
- Event sourcing popeth. Cymhwyso event sourcing a CQRS i feysydd creu-darllen-diweddaru-dileu syml nad oedd erioed angen hanes, gan brynu cymhlethdod serth heb unrhyw fudd.
- Dim llywodraethu sgemâu. Cynhyrchwyr yn newid siapiau digwyddiadau’n rhydd, gan dorri defnyddwyr i lawr yr afon o bell heb unrhyw wiriadau cydnawsedd.
- Anwybyddu’r outbox. Ysgrifennu i’r gronfa ddata a chyhoeddi digwyddiad fel dau gam ar wahân, fel bod chwalfa rhyngddynt yn colli digwyddiadau’n dawel neu’n allyrru rhai ffantom.
- Dim triniaeth llythyrau marw. Un neges wenwynig yn blocio rhaniad, neu negeseuon wedi methu’n diflannu heb giw i’w dal a’u harchwilio.
- Llifau anweledig. Prosesu anghydamserol heb unrhyw IDau cydberthynas, dim rhybuddion oediad defnyddiwr, a dim olrhain, fel bod methiannau’n aros yn dawel nes eu bod yn dod yn ddata coll.
Model aeddfedrwydd
- Lefel 1, Cychwyn: Mae integreiddio’n alwadau pwynt-i-bwynt ad hoc, neu mae broceriaeth yn bodoli ond yn cael ei defnyddio fel cais/ateb cydamserol. Mae dyblygiadau’n torri defnyddwyr, nid oes disgyblaeth sgemâu nac olrhain ar draws neidiau, ac mae negeseuon wedi methu’n diflannu’n dawel.
- Lefel 2, Datblygu: Mae broceriaeth neu log mewn defnydd gwirioneddol ar gyfer rhai llifau, ac mae gan ychydig o dimau arferion sylfaenol: mae defnyddwyr yn dod yn idempotent ac mae ciwiau llythyrau marw’n dal rhai methiannau. Ond mae’r dull yn anghyson ar draws timau, mae digwyddiadau a gorchmynion yn dal yn ddryslyd, mae sgemâu’n newid drwy gytundeb anffurfiol, ac mae arsylladwyedd yn denau.
- Lefel 3, Safoni: Mae digwyddiadau, gorchmynion, a negeseuon yn cael eu gwahaniaethu’n fwriadol ar draws y sefydliad. Mae defnyddwyr yn idempotent yn ôl safon, mae sgemâu’n byw mewn cofrestrfa gyda pholisi cydnawsedd wedi’i ddogfennu a’i orfodi, ac mae’r transactional outbox yn gwarantu traddodi. Mae sagas gydag iawndaliadau’n trin trafodion aml-wasanaeth, mae IDau cydberthynas yn lledaenu drwy bob naid, ac mae’r patrymau hyn yn cael eu hysgrifennu i lawr a’u cymhwyso’n gyson yn hytrach na’u gadael i bob tîm ar wahân.
- Lefel 4, Rheoli: Mae’r platfform digwyddiadau’n cael ei fesur a’i reoli gyda data yn erbyn llinellau sylfaen. Mae oediad defnyddiwr, dyfnder ciw llythyrau marw, cyfraddau ail-draddodi, ac oedi prosesu’n cael eu tracio fel metrigau rhybuddio gyda throthwyon cytunedig, nid dangosfyrddau nad oes neb yn eu gwylio; mae cydnawsedd sgemâu’n cael ei wirio’n awtomatig cyn i gynhyrchydd allu cyhoeddi newid; mae ailchwarae, triniaeth methiant, ac idempotency yn cael eu profi ar gyflymder sefydlog yn hytrach na dim ond gobeithio. Mae penderfynu a ddylai rhyngweithiad penodol fod yn ddigwyddiad neu’n alwad gydamserol yn cael ei wneud ar sail tystiolaeth, ac mae capasiti, cost cadw-data, a dibynadwyedd pob broceriaeth yn cael eu hadolygu yn erbyn targedau.
- Lefel 5, Cydgysylltu: Mae arddulliau gyrru-gan-ddigwyddiadau a chydamserol yn cael eu dewis fesul rhyngweithiad fel ail natur, ac mae event sourcing a CQRS yn cael eu cymhwyso’n union lle mae anghenion archwilio ac ymholi’n eu cyfiawnhau, a nunlle arall. Mae llifau anghydamserol mor arsylladwy â rhai cydamserol, mae’r platfform yn gwella’n barhaus wrth i anghenion newid (ymddeol pynciau marw, esblygu llywodraethu sgemâu, ailgydbwyso rhaniadau), ac mae negesu wedi’i integreiddio â’r bensaernïaeth ehangach a’r strategaeth archwilio ehangach fel bod y sefydliad yn addasu ei ddyluniad digwyddiadau wrth i’r busnes a’i rwymedigaethau newid.
Syniadau ar gyfer trafodaeth
- Pa rai o’ch “digwyddiadau” presennol sydd mewn gwirionedd yn orchmynion cudd, a pha gyplu y byddech yn ei ddileu drwy eu modelu’n onest?
- Pe baech yn ailchwarae diwrnod cyfan o ddigwyddiadau drwy eich defnyddwyr yfory, beth fyddai’n torri, a beth mae hynny’n ei ddweud wrthych am eich idempotency a’ch diogelwch ailchwarae?
- Pa rannau o’ch maes sydd wir angen llwybr archwilio event sourcing, a pha rai sy’n gyflwr syml y byddech ond yn ei gymhlethu drwy ei sourcio?
- Sut y byddech yn mudo oddi ar hen fws gwasanaeth menter neu we o integreiddiadau pwynt-i-bwynt heb doriad mawr-un-tro peryglus?
- Ar gyfer eich proses aml-wasanaeth bwysicaf, ai saga go iawn wedi’i threfnu gydag iawndaliadau ydyw, neu goreograffi digymell na all unrhyw un lle unigol ei ddisgrifio?
Prif gasgliadau
- Mae pensaernïaeth gyrru-gan-ddigwyddiadau’n prynu datgysylltu, graddio annibynnol, ailchwarae, a llwybrau archwilio, ac mae’n costio dealladwyedd a chymhlethdod gweithredol, felly dewiswch hi fesul rhyngweithiad lle mae’r budd yn wirioneddol.
- Cadwch ddigwyddiadau (ffeithiau a ddigwyddodd), gorchmynion (ceisiadau i weithredu), a negeseuon (yr amlen) ar wahân, oherwydd bod y dryswch yn achosi camgymeriadau cyplu gwirioneddol.
- Dyluniwch ar gyfer traddodi o leiaf unwaith a gwnewch bob defnyddiwr yn idempotent; mae traddodi union-unwaith yn chwedl, ac mae effeithiau union-unwaith yn gamp peirianneg.
- Mae trefn fesul rhaniad, mae sgemâu’n gytundebau sy’n perthyn mewn cofrestrfa, ac mae’r outbox, ciwiau llythyrau marw, a backpressure yn blymwaith sy’n gwneud negesu’n barod ar gyfer cynhyrchiad.
- Defnyddiwch sagas gydag iawndaliadau yn lle two-phase commit, ac estynnwch am event sourcing a CQRS dim ond lle mae anghenion archwilio ac ymholi’n cyfiawnhau eu cost serth.
- Mae llifau anghydamserol yn dawel pan fyddant yn methu, felly mae IDau cydberthynas, monitro oediad defnyddiwr, ac olrhain o’r dechrau i’r diwedd yn wahaniaeth rhwng system y gellir ei gweithredu ac un anweledig.
Cyfeiriadau a darllen pellach
- Martin Kleppmann, Designing Data-Intensive Applications
- Gregor Hohpe a Bobby Woolf, Enterprise Integration Patterns
- Chris Richardson, Microservices Patterns (sagas, transactional outbox, CQRS)
- Sam Newman, Building Microservices
- Ben Stopford, Designing Event-Driven Systems
- Adam Bellemare, Building Event-Driven Microservices
- Vaughn Vernon, Implementing Domain-Driven Design (event sourcing a CQRS)
- Martin Fowler, “Event Sourcing” a “CQRS” (erthyglau martinfowler.com)
- Hector Garcia-Molina a Kenneth Salem, “Sagas” (1987)