Sifariş servisi sifarişi PostgreSQL-də saxladı və bu anda proses çökdü. OrderCreated hadisəsi brokerə getmədi: anbar malı rezerv etmədi, Leyla məktub almadı, bazada isə sifariş var. Bu, ikiqat yazı problemidir və o, demək olar ki, hər hadisə yönümlü sistemin həyatını korlayır. Bu dərsdə onu transactional outbox-un necə həll etdiyini, qəbul edəni necə idempotent etməyi, hadisələrin formatını oxuyanları sındırmadan necə dəyişməyi, saga-ların necə qurulduğunu və istifadəçiyə niyə «emal olunur» statusunu göstərmək lazım olduğunu öyrənəcəyik.
Hadisələr və komandalar
Mesajlar iki cür olur və dizayn seçimdən asılıdır. Komanda — «bunu et» xahişidir. Hadisə — «bu baş verdi» faktıdır.
| Komanda | Hadisə | |
|---|---|---|
| Mənası | «malı rezerv et» | «mal rezerv olundu» |
| Ad | feil: ReserveStock | keçmiş zaman: StockReserved |
| Ünvan | bir məlum servis | kimin olduğu bilinmir: abunəçilər |
| İmtina | qəbul edən imtina edə bilər | artıq baş verib, imtina olmaz |
Hadisələr keçmiş zamanda adlandırılır: OrderCreated, OrderPaid, PaymentFailed. SendEmail kimi ad — hadisə libasında komandadır; o, göndərəni konkret qəbul edənə bağlayır. Hadisə həmişə id, tip, versiya və vaxt olan zərfdə gəlir:
{
"id": "0f6c1c5e-3d0a-4a4b-9c58-5f6c1f1d9a10",
"type": "OrderPaid",
"version": 1,
"occurredAt": "2026-10-04T10:15:00.000Z",
"data": { "orderId": 7, "total": 87, "currency": "AZN" }
}data-ya yalnız oxuyanlara lazım olanı qoyun: identifikatorlar və əsas dəyərlər, şəxsi məlumatlı bütün sifariş yox. id və version sahələri sonra lazım olacaq.
İkiqat yazı problemi
Sifarişi bazaya yazmaq və bu barədə brokerə xəbər vermək lazımdır. Bunlar iki ayrı sistemdir və aralarında ümumi tranzaksiya yoxdur. Nə seçsəniz də, nasazlıq üçün aralıq qalır:
- əvvəl baza, sonra broker: aralarında çökdük — hadisə itir, sifariş nəticəsiz qalır;
- əvvəl broker, sonra baza: baza imtina etdi — olmayan sifariş haqqında xəyali hadisə yaranır.
Təkrarlar (retry) xilas etmir: çağırış yox, proses özü çökür. Baza ilə broker arasında paylanmış tranzaksiyalardan demək olar ki, istifadə etmirlər: onlar mürəkkəb və yavaşdır.
Transactional outbox
Fikir sadədir: brokeri tranzaksiyaya qoşmaq olmur, onda hadisəni bazaya yazırıq. Sifarişlə eyni tranzaksiyada outbox cədvəlinə sətir əlavə edirik. Ya hər iki qeyd saxlanır, ya heç biri. Ayrı relay prosesi dərc olunmamış sətirləri oxuyur, brokerə göndərir və dərc olunmuş kimi işarələyir. Prisma 7 modelləri: