Жеткізу, outbox және қалпына келтіру
Бұрылыс аяқталғанда, жауап әлі де өзі келген арнаға жетуі керек — сенімді түрде және дәл бір рет. AiHummer мұны транзакциялық outbox, идемпотентті жанама әсерлер және қайта іске қосылғаннан кейінгі бұрылысты қалпына келтіру арқылы шешеді. Үлкенірек орналастырулар үшін жеткізуді қосымша NATS шинасы алып жүре алады.
Кепілдендірілген жеткізу
Жауап бұрылыстың соңында бірден жіберілмейді. Оның орнына ол оны өндірген жұмыстың бір бөлігі ретінде outbox кезегіне қойылады, ал жеткізу жұмысшысы оны алып, бастапқы арнаға жібереді. Жауап кетер алдында берік түрде жазылатындықтан, “жауап өндірілді” мен “жауап жіберілді” арасындағы құлдырау оны жоғалта алмайды — қайта іске қосылғанда outbox жазбасы әлі сонда тұрады және жеткізу қайта басталады.
turn produces reply
└─▶ enqueue in outbox (durable)
└─▶ delivery worker ─▶ originating channel
└─ acknowledged ─▶ marked delivered
Жеткізу идемпотенттілікпен жұптасады, осылайша бұл кемінде-бір-рет жұмысшысы дәл-бір-рет сыртқы тәртіп береді: қайта-басталуға-тұрақты тізілім кілті мен жанама-әсер тосқауылы қайта жеткізілген немесе қайта ойнатылған жауаптың арнаға тек бір рет жіберілуін қамтамасыз етеді (қараңыз: Көп-жалдаушылық және идемпотенттілік).
[!NOTE] Мұндағы “дәл-бір-рет” сыртқы көрінетін нәтижені сипаттайды: пайдаланушы жауапты бір рет алады. Іштей жұмысшы жеткізуді бірнеше рет әрекет етуі мүмкін; идемпотенттілік қабаты сол әрекеттерді бір көрінетін жіберуге біріктіреді.
Қайта іске қосылғаннан кейін бұрылысты қалпына келтіру
Егер шлюз бұрылыстың ортасында қайта іске қосылса — орналастыру, құлдырау, хост қайта жүктелуі — жұмыс тасталмайды. Бұрылысты қалпына келтіру үзілген бұрылысты қайта ойнатады, осылайша ол аяқтала алады. Бұл тек жанама әсерлер идемпотентті болғандықтан ғана қауіпсіз: қайта іске қосылғанға дейін болып үлгерген кез келген пошта немесе арнаға-жіберу өзінің тізілім кілті бойынша танылады және өткізіп жіберіледі, ал болмаған бөліктер аяғына дейін орындалады. Пайдаланушы жартылай-аяқталған немесе қайталанған емес, бір тұтас жауапты көреді.
Қосымша NATS шинасы
Әдепкі бойынша жеткізу толығымен PostgreSQL арқылы жұмыс істейді, бұл минималды орналастыруды бір шлюз пен дерекқорда сақтайды. Үлкенірек немесе көп-шлюзді орнатулар үшін оның URL мекенжайын конфигурациялау арқылы жеткізуді NATS шинасына қоюға болады:
# gateway.env
AIHUMMER_NATS_URL=nats://127.0.0.1:4222
Шина шынымен де қосымша — AIHUMMER_NATS_URL орнатпаған күйде қалдырыңыз, сонда outbox
онсыз жұмыс істейді. Болған кезде NATS жеткізу жұмысы ағатын тасымал болады,
бұл прокси артындағы көлденеңінен масштабталған шлюздерге қолайлы.
[!TIP] Нөл-тоқтаусыз жаңартулар кері прокси артында екі немесе одан көп шлюзді іске қосады. Жоспарлаушы Postgres advisory құлпы арқылы бір-лидер күйінде қалады, ал идемпотентті жеткізу қосымша шлюздердің бірдеңені екі рет жібермей жүктемені бөлісе алатынын білдіреді.
Нені бақылау керек
Жеткізу — сенімділік мәселелері алдымен бетке шығатын жер, сондықтан дәл соны
бақылау керек. AiHummer телеметрияны OTLP арқылы итереді (AIHUMMER_OTEL_ENDPOINT) және
Grafana бақылау тақталарын жеткізеді; скрейп жасайтын Prometheus /metrics соңғы нүктесі жоқ.
- Жеткізу нәтижелері — әрбір жеткізу әрекетінің нәтижесі. Сәтсіздіктердің артып бара жатқан жиілігі арна немесе төмен ағындағы мәселеге нұсқайды.
- Outbox тереңдігі — қанша жауап жеткізілуді күтіп тұр. Тұрақты өсу жеткізудің артта қалып бара жатқанын білдіреді.
- DLQ тереңдігі — қайталауларын сарқып, өлі-хат кезегіне түскен жазбалар. Кез келген DLQ өсуі зерттеуге лайық.
[!WARNING] Бұларды бұрылыс кідірісі мен қателер жиілігімен қатар бақылаңыз. Өсіп бара жатқан outbox немесе DLQ — бұрылыстардың өздері әлі де сәтті болса да, төмен ағындағы арналардың нашарлап бара жатқанының ерте ескертуі.
Әрі қарай қайда
- Жеткізуді дәл-бір-рет ететін идемпотенттілік: Көп-жалдаушылық және идемпотенттілік.
- Алдымен жауапты өндіретін қозғалтқыш: Шлюз және бұрылыс қозғалтқышы.