Replikovaná zrnka
Někdy může existovat více instancí stejného aktivního agregace, například při provozu více clusterů OneInstancePerClusterAttributea použití . JournaledGrain je navržený tak, aby podporoval replikované instance s minimálním třením. Spoléhá na poskytovatele konzistence protokolu, aby spustili potřebné protokoly, aby se zajistilo, že všechny instance souhlasí se stejnou posloupností událostí. Zejména se stará o následující aspekty:
Konzistentní verze: Všechny verze stavu zrnitosti (s výjimkou nezávazných verzí) jsou založené na stejné globální sekvenci událostí. Konkrétně pokud dvě instance uvidí stejné číslo verze, uvidí stejný stav.
Závodní události: Událost může vyvolat více instancí současně. Poskytovatel konzistence tuto rasu vyřeší a zajistí, aby všichni souhlasili se stejnou posloupností.
Oznámení/reaktivita: Po vyvolání události v instanci s jednou úrovní aktualizuje poskytovatel konzistence nejen úložiště, ale také upozorní všechny ostatní instance agregace.
Obecnou diskuzi o konzistenci najdete v našem dokumentu TechReport a GSP (Global Sequence Protocol).
Podmíněné události
Závodní události můžou být problematické, pokud dojde ke konfliktu, tj. z nějakého důvodu by se obě události neměly potvrdit. Například při výběru peněz z bankovního účtu mohou dvě instance nezávisle určit, že jsou k dispozici dostatečné finanční prostředky pro výběr a vydání události pro výběr. Ale kombinace obou událostí by mohla překreslit. Aby se tomu zabránilo JournaledGrain
, rozhraní API podporuje metodu RaiseConditionalEvent .
bool success = await RaiseConditionalEvent(
new WithdrawalEvent() { /* ... */ });
Podmíněné události pečlivě zkontrolují, jestli místní verze odpovídá verzi v úložišti. Pokud ne, znamená to, že sekvence událostí mezitím vzrostla, což znamená, že tato událost ztratila závod proti nějaké jiné události. V takovém případě není podmíněná událost připojena k protokolu a RaiseConditionalEvent vrací hodnotu false.
Toto je analogie použití e-značek s aktualizacemi podmíněného úložiště a podobně poskytuje jednoduchý mechanismus, který zabraňuje potvrzení konfliktních událostí.
Je možné a rozumné používat podmíněné i nepodmíněné události pro stejné zrno, jako DepositEvent
je a a WithdrawalEvent
. Vklady nemusí být podmíněné: i když DepositEvent
dojde ke ztrátě závodu, nemusí být zrušena, ale může být stále připojena ke globálnímu pořadí událostí.
Čekání na úkol vrácený RaiseConditionalEvent
dostatečná k potvrzení události, tj. není nutné volat ConfirmEvents
.
Explicitní synchronizace
Někdy je žádoucí zajistit, aby se zrno plně chytil s nejnovější verzí. To se dá vynutit voláním:
await RefreshNow();
Dělá to dvě věci:
- Potvrdí všechny nepotvrzené události.
- Načte nejnovější verzi z úložiště.