Π ΡΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ° Π½Π° Spring Boot ΠΈ ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ ΡΡΠ΅Π· ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Axon.

ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°ΠΊΠ°Π²Π° Π·Π°Π΄Π°ΡΠ°.
ΠΠΌΠ°ΠΌΠ΅ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° ΡΠ΄Π΅Π»ΠΊΠΈ Π½Π° ΡΠΎΠ½Π΄ΠΎΠ²ΠΈΡ ΠΏΠ°Π·Π°Ρ. Π’ΠΎΠ·ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π° ΡΠ΄Π΅Π»ΠΊΠΈ ΡΡΠ΅Π· Rest-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
Π’ΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅Π·ΠΈ ΡΠ΄Π΅Π»ΠΊΠΈ, Π΄Π° Π³ΠΈ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π² Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ΄ΠΎΠ±Π½ΠΎ in-memory Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
Π’ΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
- Π΄Π° Π²ΡΡΡΠ° ΡΠΏΠΈΡΡΠΊ Ρ ΡΡΠ΅ΠΉΠ΄ΠΎΠ²Π΅;
- Π΄Π° Π²ΡΡΡΠ° ΠΏΡΠ»Π½Π°ΡΠ° ΠΏΠΎΠ·ΠΈΡΠΈΡ, Ρ.Π΅. ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° "ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ" β "ΡΠ΅ΠΊΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅Π½Π½ΠΈ ΠΊΠ½ΠΈΠΆΠ°";
- Π΄Π° Π²ΡΡΡΠ° ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ.
ΠΠ°ΠΊ ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΡΠΌ ΡΠ΅ΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ°?
Π‘ΠΏΠΎΡΠ΅Π΄ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΡΠ΅ Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·Π½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ Π·Π°Π΄Π°ΡΠ°ΡΠ° Π½Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ:
- ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ΄Π΅Π»ΠΊΠΈ ΡΡΠ΅Π· Rest;
- Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΄Π΅Π»ΠΊΠΈΡΠ΅ Π² Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ;
- in-memory Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΡ.
ΠΠ΅ΠΊΠ° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΎΠ²Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΡΡΠ²ΠΈΡ ΠΈ ΡΡΠ΅ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ, Π° Π²ΡΠΎΡΠΈΡ Π΄Π° ΠΎΡΡΠ°Π²ΠΈΠΌ Π·Π° Π²ΡΠΎΡΠ°ΡΠ° ΡΠ°ΡΡ (ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅, Π°ΠΊΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ).
Π’Π°ΠΊΠ°, ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·Π°.
ΠΡΡΠ²ΠΈΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π΄Π°Π½Π½ΠΈ ΠΈΠ·Π²ΡΠ½.
ΠΡΠΎΡΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΠΌ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅, Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈΡΠ΅.
ΠΠ°ΠΊΠ²Π°, Π΄ΠΎΡΡΠ° ΡΠ»ΠΎΠΆΠ½Π°, Π·Π°Π΄Π°ΡΠ° ΡΡΠΎΠΈ ΠΏΡΠ΅Π΄ Π½Π°Ρ?
ΠΡΡΡΠ½ΠΎΡΡ, ΡΠ΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ ΡΠ΅Π³Π° Π½Π΅ΠΊΠ° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ΅ ΡΠ΅ Π΄Π²ΠΈΠΆΠ°Ρ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅Π·ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΈ Rest, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΎΠΏΠ°ΡΠΊΠ°, ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΌΠΈΡΠ»ΡΡ Ρ ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΠΏΠ»ΡΡΠΎΠ²Π΅ ΠΈ ΠΌΠΈΠ½ΡΡΠΈ.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈ β Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΡΠ΅Π· ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Axon..
ΠΠ°ΠΊΠ²ΠΈ ΡΠ° ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π° ΡΠ°ΠΊΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?
ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ, Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡΡΠ° (Π΄Π°, ΡΡΠΊ ΠΈΠΌΠ° ΠΈ ΠΌΠΈΠ½ΡΡ, Π½ΠΎ Π·Π°ΡΠ΅Π³Π° Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΠ°ΠΌΠΎ Π·Π° ΠΏΠ»ΡΡΠΎΠ²Π΅ΡΠ΅).
ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ ΠΈ CQRS.
ΠΠ° ΡΡΠ΅ΡΠΎ ΠΌΡΡΡΠΎ, Axon ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π³ΠΎΡΠΎΠ²Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°, ΠΈ Π½ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌ ΡΠ°ΠΌΠΎ Π²ΡΡΡ
Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ°.
ΠΠ° Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅.
ΠΡΠΎΠ΅ΠΊΡΡΡ Π½ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π° gradle. Π Π½Π΅Π³ΠΎ ΡΠ΅ ΠΈΠΌΠ° ΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»Π°:
- common. ΠΌΠΎΠ΄ΡΠ» Ρ ΠΎΠ±ΡΠΈ ΡΡΡΡΠΊΡΡΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ (Π½Π΅ ΠΎΠ±ΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅);
- tradeCreator. ΠΌΠΎΠ΄ΡΠ» Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Π·Π° ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° ΡΠ΄Π΅Π»ΠΊΠΈ ΡΡΠ΅Π· Rest;
- tradeQueries. ΠΌΠΎΠ΄ΡΠ» Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ.
Π©Π΅ Π²Π·Π΅ΠΌΠ΅ΠΌ Spring Boot Π·Π° ΠΎΡΠ½ΠΎΠ²Π° ΠΈ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΠΌ ΡΡΠ°ΡΡΠ΅Ρ Axon.
Axon ΡΠ°Π±ΠΎΡΠΈ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΈ Π±Π΅Π· Spring, Π½ΠΎ Π½ΠΈΠ΅ ΡΠ΅ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π°Π΅Π΄Π½ΠΎ.
Π’ΡΠΊ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠΏΡΠ΅ΠΌ ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΠΌΠΈ Π·Π° Axon.
Π’ΠΎΠ²Π° Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΡΡΠ²ΡΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠΌΠ°ΠΌΠ΅ ΡΡΡΠ²ΡΡ β ΡΠΎΠ²Π° Π΅ ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π² Docker.
Π ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π²Π³ΡΠ°ΠΆΠ΄Π°Ρ Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ.
ΠΠΎΠ»ΡΡΠ°Π²Π° ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°. ΠΡΡΠ²ΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Axon-ΡΡΡΠ²ΡΡ (Π² Docker), ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π½Π°ΡΠΈΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ.
ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈΡΠ΅ ΡΡΡΡΡΡ ΡΡΡΠ²ΡΡΠ° ΠΈ Π·Π°ΠΏΠΎΡΠ²Π°Ρ Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ Ρ Π½Π΅Π³ΠΎ. ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ ΡΡΠ»ΠΎΠ²Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ Π½Π° Π΄Π²Π° Π²ΠΈΠ΄Π°: ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ.
Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΡΠΎ Π΅ ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ "Π°Π· ΡΡΠΌ ΠΆΠΈΠ²" (ΡΠ°ΠΊΠΈΠ²Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π»ΠΎΠ³Π²Π°Π½Π΅ debug).
ΠΠΈΠ·Π½Π΅ΡΠΎΠ²ΠΎΡΠΎ Π΅ ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠΎ "Π½ΠΎΠ²Π° ΡΠ΄Π΅Π»ΠΊΠ°".
ΠΠ°ΠΆΠ½Π° Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π΅, ΡΠ΅ ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΏΠΈΡΠ° Axon-ΡΡΡΠ²ΡΡΠ° "ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΡΠ»ΡΡΠΈΠ»ΠΎ" ΠΈ ΡΡΡΠ²ΡΡΡΡ ΠΏΡΠ΅Π΄Π°Π²Π° Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·Π° Π½Π°ΡΡΡΠΏΠ°Π½ΠΈΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ ΠΌΠΎΠΆΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠ½Π°Ρ Π±Π΅Π· Π·Π°Π³ΡΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ.
ΠΡΠΈ ΡΠ°ΠΊΠ°Π²Π° ΡΡ
Π΅ΠΌΠ° Π½Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈΡΠ΅,
Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Ρ
ΠΎΡΡΠΎΠ²Π΅.
ΠΠ°, Π΅Π΄ΠΈΠ½ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° Axon-ΡΡΡΠ²ΡΡΠ° Π½Π΅ Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½, Π½ΠΎ Π·Π°ΡΠ΅Π³Π° Π΅ ΡΠ°ΠΊΠ°.
Π Π°Π±ΠΎΡΠΈΠΌ Π² ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠΈΡΠ΅ Event Sourcing ΠΈ CQRS. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π±ΠΈ ΡΡΡΠ±Π²Π°Π»ΠΎ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ "ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ", "ΡΡΠ±ΠΈΡΠΈΡ" ΠΈ "ΠΈΠ·Π±ΠΎΡΠΈ".
Π©Π΅ ΠΈΠΌΠ°ΠΌΠ΅ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: "ΡΡΠ·Π΄Π°ΠΉ ΡΠ΄Π΅Π»ΠΊΠ°", Π΅Π΄Π½ΠΎ ΡΡΠ±ΠΈΡΠΈΠ΅ "ΡΠ΄Π΅Π»ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅Π½Π°" ΠΈ ΡΡΠΈ ΠΈΠ·Π±ΠΎΡΠΈ: "ΠΏΠΎΠΊΠ°ΠΆΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ΄Π΅Π»ΠΊΠΈ", "ΠΏΠΎΠΊΠ°ΠΆΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΡ", "ΠΏΠΎΠΊΠ°ΠΆΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ".
Π‘Ρ Π΅ΠΌΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
- ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeCreator ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠ΄Π΅Π»ΠΊΠ° ΠΏΠΎ Rest.
- ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeCreator ΡΡΠ·Π΄Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° "ΡΡΠ·Π΄Π°ΠΉ ΡΠ΄Π΅Π»ΠΊΠ°" ΠΈ Ρ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° Axon-ΡΡΡΠ²ΡΡΠ°.
- Axon-ΡΡΡΠ²ΡΡΡΡ ΠΏΡΠΈΠ΅ΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΈ Ρ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π½Π° Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π», Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeCreator.
- ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeCreator ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΡΠΎΡΠΌΠΈΡΠ° ΡΡΠ±ΠΈΡΠΈΠ΅ "ΡΠ΄Π΅Π»ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅Π½Π°" ΠΈ Π³ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° Axon-ΡΡΡΠ²ΡΡΠ°.
- Axon-ΡΡΡΠ²ΡΡΡΡ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ ΠΈ Π³ΠΎ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π½Π° Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ΠΈΡΠ΅ Π°Π±ΠΎΠ½Π°ΡΠΈ.
- Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π» β ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeQueries.
- ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeQueries ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π²ΡΡΡΠ΅ΡΠ½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ.
(ΠΠ°ΠΆΠ½ΠΎ Π΅, ΡΠ΅ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠΈ Π½Π° ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΡΡ tradeQueries ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½, Π½ΠΎ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ).
ΠΠ°, axon-ΡΡΡΠ²ΡΡΡΡ ΡΡΠΎΠΈ Π² ΡΠ΅Π½ΡΡΡΠ° Π½Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅, Π²ΡΠΈΡΠΊΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠ΅Π· Π½Π΅Π³ΠΎ.
ΠΠ΅ΠΊΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ.
ΠΠ° Π΄Π° Π½Π΅ Π·Π°ΡΡΡΠΏΠ²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ° Ρ ΠΊΠΎΠ΄, ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠ΅ Π΄Π°ΠΌ ΡΠ°ΠΌΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ, Π»ΠΈΠ½ΠΊΡΡ ΠΊΡΠΌ ΡΠ΅Π»ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΎΠ±ΡΠΈΡ ΠΌΠΎΠ΄ΡΠ» common.
Π Π½Π΅Π³ΠΎ ΠΎΠ±ΡΠΈΡΠ΅ ΡΠ°ΡΡΠΈ β ΡΠΎΠ²Π° Π΅ ΡΡΠ±ΠΈΡΠΈΠ΅ (class CreatedTradeEvent). ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π΅ΡΠΎ, Π²ΡΡΡΠ½ΠΎΡΡ, ΡΠΎΠ²Π° Π΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠΎΡΠΎΠ΄ΠΈΠ»Π° ΡΠΎΠ²Π° ΡΡΠ±ΠΈΡΠΈΠ΅, Π½ΠΎ Π² ΠΌΠΈΠ½Π°Π»ΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅. Π ΠΌΠΈΠ½Π°Π»ΠΎΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ.
ΠΡΡΠ³ΠΈ ΠΎΠ±ΡΠΈ ΡΡΡΡΠΊΡΡΡΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π·Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° (class Position), ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ° (class Trade) ΠΈ ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°ΡΠ° (enum Side), Ρ.Π΅. ΠΊΡΠΏΡΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ΄Π°Π²Π°Π½Π΅.
ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΊΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π° tradeCreator.
Π’ΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ» ΠΈΠΌΠ° Rest-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (class TradeController) Π·Π° ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° ΡΠ΄Π΅Π»ΠΊΠΈ.
ΠΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΡΠ΄Π΅Π»ΠΊΠ° ΡΠ΅ ΡΠΎΡΠΌΡΠ»ΠΈΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° βΡΡΠ·Π΄Π°ΠΉ ΡΠ΄Π΅Π»ΠΊΠ°β ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° axon-ΡΡΡΠ²ΡΡΠ°.
@PostMapping("/trade")
public ResponseEntity create(@RequestBody Trade trade) {
var createTradeCommand = CreateTradeCommand.builder()
.tradeId(trade.getTradeId())
...
.build();
var result = commandGateway.sendAndWait(createTradeCommand, 3, TimeUnit.SECONDS);
return ResponseEntity.ok(result.get().toString());
}
ΠΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ»Π°ΡΡΡ class TradeAggregate.
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Axon Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅ΡΠΈ, ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Π°Π½ΠΎΡΠ°ΡΠΈΡΡΠ° @Aggregate.
ΠΠ΅ΡΠΎΠ΄ΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ° (ΡΡΡ ΡΡΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅):
@CommandHandler
public TradeAggregate(CreateTradeCommand command) {
log.info("command: {}", command);
var event = CreatedTradeEvent.builder()
.tradeId(command.tradeId())
....
.build();
AggregateLifecycle.apply(event);
}
ΠΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΡΡΠ±ΠΈΡΠΈΠ΅ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°.
ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΠΊΠ»Π°ΡΠ° CreateTradeCommand.
Π‘Π΅Π³Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ» tradeQueries.
ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡΡΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π² ΠΏΠ°ΠΊΠ΅ΡΠ° queries.
Π ΡΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ» ΡΡΡΠΎ ΠΈΠΌΠ° Rest-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
public class TradeController.
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠ°: βΠΏΠΎΠΊΠ°ΠΆΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ΄Π΅Π»ΠΊΠΈβ.
@GetMapping("/trade/all")
public List findAllTrades() {
return queryGateway.query(new FindAllTradesQuery(),
ResponseTypes.multipleInstancesOf(Trade.class)).join();
}
Π‘ΡΠ·Π΄Π°Π²Π° ΡΠ΅ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°.
ΠΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ»Π°ΡΡΡ TradesEventHandler.
Π Π½Π΅Π³ΠΎ ΠΈΠΌΠ° ΠΌΠ΅ΡΠΎΠ΄, ΠΎΡΠ±Π΅Π»ΡΠ·Π°Π½ Ρ Π°Π½ΠΎΡΠ°ΡΠΈΡΡΠ°.
@QueryHandler
public List handleFindCurrentPositionQuery(FindCurrentPositionQuery query)
Π’ΠΎΠΉ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ in-memory Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ.
ΠΡΠ·Π½ΠΈΠΊΠ²Π° Π²ΡΠΏΡΠΎΡΡΡ, ΠΊΠ°ΠΊ Π² ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ°.
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΡΠΎΠ²Π°, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΎΡ ConcurrentHashMap, ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ΠΈ Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ.
ΠΠ° ΡΡΡ
Π½ΠΎΡΠΎ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΌΠ΅ΡΠΎΠ΄ΡΡ:
@EventHandler
public void on(CreatedTradeEvent event) {
log.info("event:{}", event);
var trade = Trade.builder()
...
.build();
trades.put(event.tradeId(), trade);
position.merge(event.shortName(), event.size(),
(oldValue, value) -> event.side() == Side.BUY ? oldValue + value : oldValue - value);
}Π’ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΡΠ±ΠΈΡΠΈΠ΅ "ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΡΠ΄Π΅Π»ΠΊΠ°" ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Map-ΠΎΠ²Π΅ΡΠ΅.
Π’ΠΎΠ²Π° ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠΎΡΠΊΠΈ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ.
ΠΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π·Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅ Π½Π° Axon?
ΠΡΡΠ²ΠΎ, ΡΠΎΠ²Π° ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, ΠΏΠΎΡΠ²ΡΠ²Π° ΡΠ΅ ΡΠΎΡΠΊΠ° Π½Π° ΠΎΡΠΊΠ°Π· - Axon ΡΡΡΠ²ΡΡ, Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠΈΠ½Π°Π²Π°Ρ ΠΏΡΠ΅Π· Π½Π΅Π³ΠΎ.
ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ, ΡΡΠ½ΠΎ ΡΠ΅ ΠΏΡΠΎΡΠ²ΡΠ²Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ - Π²ΡΠ΅ΠΌΠ΅Π²Π° Π½Π΅ΡΡΠ³Π»Π°ΡΡΠ²Π°Π½ΠΎΡΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²Π° ΡΠ΄Π΅Π»ΠΊΠ° ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΌΠΈΠ½Π΅ Π½Π΅ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ°ΠΊΠ²ΠΎ ΠΎΡΡΠ°Π²Π° Π½Π΅ΠΈΠ·ΠΊΠ°Π·Π°Π½ΠΎ?
Π‘ΡΠ²ΡΠ΅ΠΌ Π½ΠΈΡΠΎ Π½Π΅ Π΅ ΠΊΠ°Π·Π°Π½ΠΎ Π·Π° Event Sourcing ΠΈ CQRS, ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ° ΡΠ΅ ΠΈ Π·Π° ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ° Π½ΡΠΆΠ½ΠΈ.
ΠΠ΅Π· ΠΎΠ±ΡΡΠ½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π·ΠΈ ΠΏΠΎΠ½ΡΡΠΈΡ, Π½ΡΠΊΠΎΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΡΡΠ°Π½Π°Ρ Π½Π΅ΡΠ°Π·Π±ΡΠ°Π½ΠΈ.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΠΊΠΎΠ΄Π° ΡΡΡΠΎ Π΄Π° ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠ΅.
ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π½Π° 21 ΡΠ΅ΠΏΡΠ΅ΠΌΠ²ΡΠΈ.
.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
