Расондан, outbox ва барқароркунӣ
Вақте ки навбат ба охир мерасад, ҷавоб ҳанӯз бояд ба каноле, ки аз он омадааст, бирасад — боэътимод ва маҳз як маротиба. AiHummer инро бо transactional outbox, side-effect-ҳои idempotent ва барқароркунии навбат пас аз бозоғозӣ идора мекунад. Як шинаи ихтиёрии NATS метавонад расонданро барои ҷойгиркуниҳои калонтар иҷро кунад.
Расондани кафолатнок
Ҷавоб дар охири навбат фавран фиристода намешавад. Ба ҷои он, он ҳамчун қисми ҳамон коре, ки онро тавлид кардааст, дар outbox ба навбат гузошта мешавад ва коргари расондан онро гирифта, ба канали ибтидоӣ мефиристад. Азбаски ҷавоб пеш аз тарк кардан ба таври устувор сабт мешавад, садамае дар байни «ҷавоб тавлид шуд» ва «ҷавоб фиристода шуд» наметавонад онро гум кунад — ҳангоми бозоғозӣ воридоти outbox ҳанӯз дар ҷояш ҳаст ва расондан аз нав идома меёбад.
turn produces reply
└─▶ enqueue in outbox (durable)
└─▶ delivery worker ─▶ originating channel
└─ acknowledged ─▶ marked delivered
Расондан бо idempotency ҷуфт карда шудааст, то ин коргари at-least-once рафтори exactly-once-и берунӣ диҳад: калиди устувори resume-stable дар дафтари ҳисоб ва монеаи side-effect таъмин мекунанд, ки ҷавоби аз нав фиристодашуда ё такроршуда танҳо як маротиба ба канал фиристода шавад (нигаред ба Бисёрмустаъҷирӣ ва idempotency).
[!NOTE] «Exactly-once» дар ин ҷо натиҷаи аз берун намоёнро тавсиф мекунад: корбар ҷавобро як маротиба мегирад. Дар дарун коргар метавонад расонданро зиёда аз як маротиба кӯшиш кунад; қабати idempotency он кӯшишҳоро ба як фиристодани намоён ҷамъ мекунад.
Барқароркунии навбат пас аз бозоғозӣ
Агар gateway дар миёнаи навбат бозоғоз шавад — деплой, садама, бозоғозии host — кор тарк карда намешавад. Барқароркунии навбат навбати қатъшударо аз нав иҷро мекунад, то он ба анҷом расад. Ин танҳо аз он сабаб бехатар аст, ки side-effect-ҳо idempotent ҳастанд: ҳар почта ё фиристодани канал, ки пеш аз бозоғозӣ аллакай рӯй дода буд, бо калиди дафтари ҳисобаш шинохта мешавад ва нодида гирифта мешавад, дар ҳоле ки қисматҳое, ки рӯй надода буданд, то анҷом иҷро мешаванд. Корбар як ҷавоби ягона ва пурраро мебинад, на нимматалукшуда ва на такрорӣ.
Шинаи ихтиёрии NATS
Бо нобаёнӣ расондан комилан тавассути PostgreSQL кор мекунад, ки ҷойгиркунии ҳадди ақалро ба як gateway плюс пойгоҳи додаҳо нигоҳ медорад. Барои танзимоти калонтар ё бисёр-gateway шумо метавонед расонданро бо танзими URL-и он ба шинаи NATS гузаронед:
# gateway.env
AIHUMMER_NATS_URL=nats://127.0.0.1:4222
Шина воқеан ихтиёрӣ аст — AIHUMMER_NATS_URL-ро муқаррар накунед ва outbox бе он
кор мекунад. Ҳангоми мавҷуд будан, NATS ба нақлиёте табдил меёбад, ки тавассути он
кори расондан ҷорӣ мешавад, ки барои gateway-ҳои уфуқан миқёсшуда дар паси прокси
мувофиқ аст.
[!TIP] Навсозиҳои бе вақти бекорӣ ду ё зиёда gateway-ро дар паси reverse proxy иҷро мекунанд. Ҷадвалбанд тавассути Postgres advisory lock single-leader боқӣ мемонад ва расондани idempotent маънои онро дорад, ки gateway-ҳои иловагӣ метавонанд борро бе ду маротиба фиристодани чизе тақсим кунанд.
Чиро бояд назорат кард
Расондан ҷоест, ки мушкилоти эътимоднокӣ аввал зоҳир мешаванд, бинобар ин он чизест,
ки бояд назорат шавад. AiHummer телеметрияро тавассути OTLP
(AIHUMMER_OTEL_ENDPOINT) мефиристад ва панелҳои Grafana-ро таъмин мекунад;
endpoint-и Prometheus /metrics барои scrape вуҷуд надорад.
- Тақсимоти расондан — натиҷаи ҳар кӯшиши расондан. Суръати афзоянда нокомиҳо ба мушкилоти канал ё downstream ишора мекунад.
- Умқи outbox — чанд ҷавоб дар интизори расондан аст. Афзоиши устувор маънои онро дорад, ки расондан қафо мемонад.
- Умқи DLQ — воридотҳое, ки кӯшишҳои такрории худро тамом карданд ва ба навбати dead-letter афтоданд. Ҳар афзоиши DLQ сазовори тафтиш аст.
[!WARNING] Инҳоро дар баробари таъхири навбат ва суръати хато назорат кунед. Outbox ё DLQ-и афзоянда огоҳии барвақт аст, ки канолҳои downstream вайрон шудаанд, ҳатто вақте ки худи навбатҳо ҳанӯз муваффақ мешаванд.
Қадами навбатӣ ба куҷо
- Idempotency-е, ки расонданро exactly-once мекунад: Бисёрмустаъҷирӣ ва idempotency.
- Муҳаррике, ки ҷавобро дар навбати аввал тавлид мекунад: Gateway ва муҳаррики навбат.