Yetkazish, outbox va tiklash
Turn tugaganda, javob baribir oʻzi kelgan kanalga yetib borishi kerak — ishonchli tarzda va aynan bir marta. AiHummer buni tranzaksion outbox, idempotent yon-taʼsirlar va qayta ishga tushirishdan keyin turn tiklash bilan boshqaradi. Ixtiyoriy NATS shinasi kattaroq oʻrnatmalar uchun yetkazishni olib yura oladi.
Kafolatlangan yetkazish
Javob turn oxirida ichki tarzda yuborilmaydi. Buning oʻrniga u uni yaratgan ishning bir qismi sifatida outbox’ga navbatga qoʻyiladi, va yetkazish ishchisi uni olib boshlang’ich kanalga yuboradi. Javob chiqishidan oldin bardoshli tarzda yozilgani uchun, “javob yaratildi” va “javob yuborildi” orasidagi qulash uni yoʻqota olmaydi — qayta ishga tushirishda outbox yozuvi hali ham mavjud va yetkazish davom etadi.
turn produces reply
└─▶ enqueue in outbox (durable)
└─▶ delivery worker ─▶ originating channel
└─ acknowledged ─▶ marked delivered
Yetkazish idempotentlik bilan juftlanadi, shunda bu kamida-bir-marta ishchisi aynan-bir-marta tashqi xulqni beradi: davom-barqaror ledger kaliti va yon-taʼsir toʻsigʻi qayta yetkazilgan yoki qayta ijro etilgan javob kanalga faqat bir marta yuborilishini taʼminlaydi (qarang Koʻp-tenantlik va idempotentlik).
[!NOTE] Bu yerda “aynan-bir-marta” tashqi koʻrinadigan natijani tasvirlaydi: foydalanuvchi javobni bir marta oladi. Ichki tarzda ishchi yetkazishni bir martadan koʻp urinib koʻrishi mumkin; idempotentlik qatlami oʻsha urinishlarni bitta koʻrinadigan yuborishga yigʻadi.
Qayta ishga tushirishdan keyin turn tiklash
Agar gateway turn oʻrtasida qayta ishga tushsa — deploy, qulash, host qayta yuklanishi — ish tashlab qoʻyilmaydi. Turn tiklash uzilgan turn’ni qayta ijro etadi, shunda u yakunlana oladi. Bu faqat yon-taʼsirlar idempotent boʻlgani uchun xavfsiz: qayta ishga tushirishdan oldin allaqachon sodir boʻlgan har qanday pochta yoki kanal-yuborishi oʻzining ledger kaliti boʻyicha tanib olinadi va oʻtkazib yuboriladi, sodir boʻlmagan qismlar esa yakuniga yetkaziladi. Foydalanuvchi yarim tugagan yoki takroriy emas, bitta toʻliq javobni koʻradi.
Ixtiyoriy NATS shinasi
Standart holatda yetkazish butunlay PostgreSQL orqali ishlaydi, bu minimal oʻrnatmani bitta gateway va maʼlumotlar bazasiga saqlaydi. Kattaroq yoki koʻp-gateway sozlamalari uchun siz yetkazishni URL’ni sozlash orqali NATS shinasiga qoʻyishingiz mumkin:
# gateway.env
AIHUMMER_NATS_URL=nats://127.0.0.1:4222
Shina haqiqatan ham ixtiyoriy — AIHUMMER_NATS_URL’ni oʻrnatilmagan qoldiring va
outbox usiz ishlaydi. Mavjud boʻlganda NATS yetkazish ishi oqib oʻtadigan
transportga aylanadi, bu proksi ortidagi gorizontal masshtablangan gateway’larga
mos keladi.
[!TIP] Nol-toʻxtashli yangilanishlar teskari proksi ortida ikki yoki undan koʻp gateway’ni ishga tushiradi. Rejalashtiruvchi Postgres maslahat qulfi orqali bitta-yetakchi boʻlib qoladi, va idempotent yetkazish qoʻshimcha gateway’lar hech narsani ikki marta yubormasdan yukni boʻlishishi mumkinligini anglatadi.
Nimani kuzatish kerak
Yetkazish — bu ishonchlilik muammolari birinchi paydo boʻladigan joy, shuning
uchun u kuzatiladigan narsa. AiHummer telemetriyani OTLP
(AIHUMMER_OTEL_ENDPOINT) ustida yuboradi va Grafana boshqaruv panellarini
yetkazib beradi; chizib olish uchun Prometheus /metrics endpoint’i yoʻq.
- Yetkazish dispozitsiyalari — har bir yetkazish urinishining natijasi. Ortib borayotgan muvaffaqiyatsizlik darajasi kanal yoki quyi oqim muammosiga ishora qiladi.
- Outbox chuqurligi — qancha javob yetkazilishni kutib turibdi. Barqaror oʻsish yetkazish ortda qolayotganini anglatadi.
- DLQ chuqurligi — qayta urinishlarini tugatgan va oʻlik-xat navbatiga tushgan yozuvlar. Har qanday DLQ oʻsishi tekshiruvga loyiq.
[!WARNING] Bularni turn kechikishi va xato darajasi bilan birga kuzating. Oʻsib borayotgan outbox yoki DLQ — turn’larning oʻzlari hali ham muvaffaqiyatli boʻlganda ham quyi oqim kanallari yomonlashayotganining erta ogohlantirishi.
Keyin qayerga
- Yetkazishni aynan-bir-marta qiladigan idempotentlik: Koʻp-tenantlik va idempotentlik.
- Birinchi navbatda javobni yaratadigan engine: Gateway va turn engine.