Sdílet prostřednictvím


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:

  1. Potvrdí všechny nepotvrzené události.
  2. Načte nejnovější verzi z úložiště.