Saga — bitta biznes operatsiyasini bir nechta xizmat yoki ma’lumot omboridagi lokal tranzaksiyalar ketma-ketligiga ajratib, xato holatida oldingi bosqichlar ta’sirini kompensatsiya qiladigan taqsimlangan tranzaksiya patterni. Har bosqich o‘z service database’ida commit qiladi va keyingi command yoki eventni boshlaydi. Saga ACID global rollback bilan aynan bir xil emas: oraliq holatlar tashqaridan ko‘rinishi mumkin.
Lokal tranzaksiyalar
Masalan, buyurtma jarayoni Order yaratish, Inventory rezerv qilish va Payment olish bosqichlaridan iborat. Har xizmat faqat o‘z ma’lumotini atomik o‘zgartiradi. Inventory muvaffaqiyatsiz bo‘lsa Order bekor qilinadi; Paymentdan keyin shipment xato qilsa refund yoki manual review kerak bo‘lishi mumkin.
Kompensatsiya oldingi byte holatini avtomatik tiklash emas. Email yuborilganini “yuborilmagan” qilib bo‘lmaydi; keyingi tuzatish xabari yuboriladi. Valyuta kursi o‘zgargan refund ham original debitning oddiy inverse’i bo‘lmasligi mumkin. Har biznes amali uchun semantik compensation belgilanadi.
Choreography
Choreographyda markaziy coordinator yo‘q. Har xizmat eventni tinglab lokal amal bajaradi va yangi event chiqaradi. Masalan OrderCreated -> StockReserved -> PaymentCaptured. Xizmatlar producerning manzilini emas, event contractini biladi.
Kichik flowda bu loose coupling beradi. Ko‘p bosqich va branchda jarayonni bitta joyda ko‘rish qiyin, cyclic event va yashirin dependency paydo bo‘lishi mumkin. End-to-end statusni kuzatish uchun correlation ID va saga ID zarur.
Orchestration
Orchestrationda saga orchestrator qaysi commandni qachon yuborishni va qaysi compensationni ishga tushirishni boshqaradi. Participant business amalini bajaradi va natija qaytaradi. Workflow kodi bir joyda ko‘rinadi, lekin orchestrator bottleneck yoki haddan tashqari markaziy business servicega aylanmasligi kerak.
Orchestrator holati persistent saqlanadi. Process qayta ishga tushganda qaysi step tugaganini bilib davom etadi. Timer uzoq kutayotgan participantni timeout qiladi. Bir javob kech kelib compensationdan keyin yetib kelsa, state machine uni to‘g‘ri talqin qiladi.
Yetkazish va idempotency
Command va event at-least-once yetkazilishi mumkin. Har step saga ID va operation ID bo‘yicha idempotent bo‘ladi. Participant natijani saqlab, duplicate commandga oldingi javobni qaytaradi. Transactional outbox lokal database commit bilan outgoing eventni atomik bog‘laydi.
Inbox/deduplication consumerda takroriy eventni cheklaydi. Event ordering partition key bilan boshqarilishi mumkin, ammo global tartibga tayanish scale’ni cheklaydi. State machine eski versiyadagi eventni qabul qilish qoidalariga ega.
Isolation muammolari
Saga bosqichlari orasida boshqa tranzaksiya oraliq holatni o‘qishi mumkin. Dirty readga o‘xshash business anomaliya, lost update yoki resource overbooking yuz beradi. Semantic lock obyektni PENDING holatiga qo‘yishi, version check stale update’ni rad etishi, escrow rezerv resursni vaqtincha band qilishi mumkin.
Saga muvaffaqiyat yoki compensation bilan tugamasdan qolsa alert va reconciliation kerak. Kompensatsiya ham xato qilishi mumkin; retrydan keyin manual intervention holati ochiladi. Audit log har step, command va natijani saqlaydi.
Saga versiyasi
Uzoq davom etuvchi saga ishlayotgan paytda workflow kodi deploy bilan o‘zgarishi mumkin. Instance qaysi definition versiyasida boshlanganini saqlaydi. Yangi stepni o‘rtadagi eski instancega majburan qo‘shish state transitionni buzadi. Engine eski workflow kodini saqlashi yoki explicit migration orqali instance holatini yangi versiyaga ko‘chirishi mumkin.
Parallel branchlar
Saga bir nechta mustaqil stepni parallel boshlashi mumkin. Join qaysi javoblar tugaganini persistent kuzatadi. Bir branch xato qilsa, allaqachon muvaffaqiyatli branchlar compensation oladi, hali ishlayotgan command esa cancel qilinadi yoki kech natija idempotent state machine orqali rad etiladi. Cancel transport xabarini yo‘q qilish emas; participant cooperative cancellationni qo‘llashi kerak.
Bog‘liq tushunchalar
Distributed transaction, Compensation, Orchestration, Choreography, Transactional outbox, Idempotency