Axon hádzanie LockAcquisitionFailedException

0

Otázka

Ja používam axon rámca s jar boot verzia

compile("org.axonframework:axon-spring-boot-starter:4.3.3") {
    exclude group: 'org.axonframework', module: 'axon-server-connector'
}

Nedávno som si začala všímať určité business workflow zastaviť a zrazu, keď som čítal denníky som našiel tento výnimkou

Command 'com.example.MyCommand' resulted in org.axonframework.common.lock.LockAcquisitionFailedException(Failed to acquire lock for aggregate identifier(AGG_ID), maximum attempts exceeded (100))

Toto začalo vyskytujúce sa náhle a jeho stále častejšie s časom.

Súhrnná je nakonfigurovaný na používanie snapshotting

@Bean public SnapshotTriggerDefinition MyAggregateSnapshotTriggerDefinition(Snapshotter snapshotter) { 
   return new EventCountSnapshotTriggerDefinition(snapshotter, 200); 
}

Tento agregát má iba niekoľko inštancií a zostávajú nažive pre veľmi dlhé časové obdobie (roky)

Čítal som, že táto výnimka je vyvolaná, ak proces sa zdá podržte tlačidlo zámku na súhrnné až príliš dlho, zatiaľ príkaz požadované zámok a timeouted čaká na to.

Celková nemá veľké množstvo údajov

@Aggregate(snapshotTriggerDefinition = "MyAggregateSnapshotTriggerDefinition")
public class MyAggregate {
   @AggregateIdentifier
   private String aggId;
   private boolean paused;
   private int pausingChangelist;
   private RequestCause pauseCause; //enum
   private Seat seat;
   private Queue<Reservation> reservationQueue;
   private boolean canPauseBuildPool;

  ...

}

ŽIADNE príkazy odoslané do tejto súhrnnej sú zasielané v "sendAndWait" režime.

Všetky príkazy, ktoré majú malé zaťaženie a nie je ťažké výpočet sa deje v príkazovom riadku Obslužný metódy. Jeho litreally kontrolu niektorých boolean vlajky a informačných podujatí.

V prípade objednania popisovače na druhej strane si niektorí logiky. Oni manipulovať rezervácie frontu do volebnej miestnosti a vkladanie rezervácie.

@EventSourcingHandler
public void on(CertainEvent event) {
    // poll from queue if not empty
    // raise SeatReservedEvent
}

@EventSourcingHandler
public void on(SeatReservedEvent event) {
    // reserve seat
}

@EventSourcingHandler
public void on(SeatFreedEvent event) {
    //  free the seat 
    // poll from queue
    // if queue not empty -> raise SeatReservedEvent  
}

@EventSourcingHandler
public void on(SeatReservationQueuedEvent event) {
    // add to queue
}

Podivné veci, ako dobre, som skontroloval iných miest, kde sa to isté výnimkou je hodená a oni sa zdá, že všetci majú rovnaké chybové hlásenie, ale tá moja je len to, že má iný počet pokusov (100)

LockAcquisitionFailedException: 
Failed to acquire lock for aggregate identifier(AGG_ID), 
maximum attempts exceeded (2147483647)

Čítal som, kód PessimisticLockFactory a bol schopný pochopiť, že toto číslo (2147483647) predstavuje počet krát proces sa snažil získať zámok na agregovanom.

Prečo je 100 len v mojom prípade? (ŽIADNE ďalšie config bol pridaný z mojej strany)

Ako to môžem vyriešiť tento problém? ako môžem sledovať zámky na súhrnné? ako vedieť, aký proces aquired token a nechcel vydať ju?

axon java spring
2021-10-20 21:47:19
2
0

V skutočnosti, táto výnimka sa hodil, keď Agregát je uzamknutý (pretože niektoré drahé operácie možno?) a iného vlákna sa snaží zablokovať to, ako dobre.

V podstate váš Agregát je vaše hranice, čo znamená, žiadne súbežné operácie bude niekedy stalo, na neho. Pre to pracovať, musí byť zamknuté hneď ako nejakú niť začne pracovať na ňom. Ďalšie vlákna sa ísť na front a bude sa snažiť získať zámok z času na čas a dať až po určitom čase (to je výnimkou, že ste stále).

Pre logiku, môžete skontrolovať zablokovaniemetóda. Pre predvolené hodnoty, môžete sa pozrieť na Builder predvolené hodnoty.

Na otázku, prečo sa to deje, z vášho popisu sa zdá, že ako váš @EventSourcingHandlers robia "príliš veľa". To už je kód vôňa je pre mňa ako @EventSourcingHandlers nikdy sa uplatňujú nové Udalosti! Reagujú na Udalosti z minulosti a oni by nemali "písať nová história'.

Na druhej strane, možno vaša @CommandHandlers by mala byť kontrola business logiky a uplatňovanie nových Udalostí, čo je obvyklý prípad použitia za to.

KR,

2021-10-21 08:37:17

Dobrý deň, viete, prečo to pokus o získanie pre 100 krát a v iných usecases sa snažil 2147483647 časy?
Nader Kahwaji

Súhlasím s tým, na časť prípade objednania poskytovatelia informačných podujatí je mätúce a zlú prax
Nader Kahwaji

Nemám... predvolené hodnoty sú acquireAttempts = 6000 a lockAttemptTimeout = 10 zatiaľ čo maximumQueued je Integer.MAX_VALUE (na 2147483647 videl si niekde). To je miesto, kde zmätok môžu pochádzať od.
Lucas Campos

Pozrel som sa na kód pre triedu PessimisticLockFactory a hodnoty pre acquireAttempts je 100 a lockAttemptTimeout je 600. Existuje spôsob, ako môžem zvýšiť to?
Nader Kahwaji
0

Prečo je 100, len v mojom prípade? (ŽIADNE ďalšie config bol pridaný z mojej strany)

Zdá sa, že tam bola chyba v 4.3.x a predchádzajúcich verziách. Správa ukazuje maximumQueued a nie acquireAttempts. Toto dopustiť chýb, takže ak ste upgrade na najnovšiu verziu Axon Rámec mali by ste vidieť správnu hodnotu.

2021-10-22 10:57:16

Pozrel som sa na decompiled triedy PessimisticLockFactory a prihlásený premennej je naozaj acquireAttempts. V zmysle kódexu už obsahuje opraviť.
Nader Kahwaji

Páči sa vám poradiť zvýšenie počtu získať pokusy? ak áno, ako to môžeme urobiť?
Nader Kahwaji

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................