At-least-once delivery — xabar yetkazish modeli bo‘lib, tizim qabul qilingan xabarni iste’molchiga kamida bir marta yetkazishga harakat qiladi. Xabar yo‘qolib ketmasligi ustuvor, ammo ayrim nosozliklarda ayni xabar ikki yoki undan ko‘p marta kelishi mumkin. Kafolat odatda broker, mijoz va tasdiqlash protokoli ishlayotgan belgilangan chegarada amal qiladi; u butun biznes operatsiyasi aynan bir marta bajarilishini avtomatik ta’minlamaydi.
Tasdiqlash mexanizmi
Broker xabarni iste’molchiga beradi va acknowledgement — ack kutadi. Ack kelgach xabar muvaffaqiyatli qayta ishlangan deb belgilanadi yoki navbatdan olib tashlanadi. Ack belgilangan muddatda kelmasa, broker xabarni o‘sha yoki boshqa iste’molchiga qayta yetkazadi.
Noaniqlik iste’molchi domen yozuvini bazaga kiritib bo‘lgach, ack brokerga yetmasdan to‘xtaganda yuz beradi. Broker bajarilgan ishni bilmaydi va xabarni qayta beradi. Agar iste’molchi har safar yangi to‘lov yoki yozuv yaratsa, ikki karra ta’sir hosil bo‘ladi. Ackni ish tugashidan oldin yuborish esa aksincha xavf tug‘diradi: worker keyin to‘xtasa, xabar bajarilmay qoladi, broker esa uni tugallangan deb hisoblaydi.
Idempotent iste’molchi
Amaliy tizim at-least-once yetkazishni idempotent qayta ishlash bilan birlashtiradi. Har hodisa noyob ID oladi. Iste’molchi shu ID ni domen o‘zgarishi bilan bir tranzaksiyada qayd etadi. Takroriy xabar kelganda ID mavjudligi aniqlanib, qo‘shimcha ta’sir yaratilmaydi.
Ma’lumotlar bazasidagi unique constraint parallel workerlar poygasini atomik to‘xtatadi. Faqat avval SELECT, keyin INSERT bajarish xavfli, chunki ikkala worker ham yozuv yo‘q deb ko‘rishi mumkin. Alternativ usul — resursning kerakli yakuniy holatini qayta yozish, lekin bu barcha domen amallariga, xususan balansni oshirishga mos kelmaydi.
Qayta yetkazish siyosati
Vaqtinchalik tarmoq yoki servis xatosida retry foydali. Doimiy noto‘g‘ri format, mavjud bo‘lmagan majburiy obyekt yoki dasturiy xato esa cheksiz qayta yetkazishda “poison message”ga aylanadi. Brokerlar odatda urinishlar soni yoki yosh chegarasidan keyin xabarni dead-letter queue ga o‘tkazadi.
Backoff va jitter nosoz xizmatga bir vaqtda ko‘p qayta so‘rov tushishini kamaytiradi. Xabarlarning tartibi muhim bo‘lsa, qayta yetkazish keyingi xabarlarning oldinga o‘tishiga ta’sir qilishi mumkin. Partition asosidagi tizimlarda tartib faqat bir partition ichida kafolatlanishi odatiy.
Kafolat chegarasi
At-least-once “har qanday sharoitda hech qachon yo‘qolmaydi” degani emas. Brokerning diskka yozish, replikatsiya, producer acknowledgement va retention sozlamalari ham chidamlilikka ta’sir qiladi. Producer xabar brokerga qabul qilinganini bilmasdan qayta yuborsa, dublikat brokerga kirish bosqichidayoq paydo bo‘ladi.
Monitoringda redelivery soni, ack kechikishi, dead-letter oqimi va iste’molchi xatolari kuzatiladi. Dublikatlar keskin ko‘payishi workerlarning sekinlashgani, visibility timeout qisqaligi yoki ack yo‘li uzilganini ko‘rsatishi mumkin. Kafolatni baholashda broker yetkazishi bilan domen tranzaksiyasi alohida ko‘riladi.
Producer tomoni
Kafolat consumer bilan cheklanmaydi. Producer brokerga xabar yuborib, qabul tasdig‘ini olmasa, u qayta yuboradi. Broker birinchi nusxani saqlagan bo‘lsa, navbatga ikki yozuv tushishi mumkin. Ayrim platformalar producer ID va sequence number orqali shu bosqichdagi dublikatni kamaytiradi. Biroq producer deduplicationi tashqi ma’lumotlar bazasida bajarilgan biznes amalni qamramaydi; outbox pattern domen commitidan keyin xabar yo‘qolishi yoki ikki marta chiqishini boshqaradi. Producer va consumer kafolatlari tizim hujjatida alohida chegaralar bilan ifodalanadi.
Bog‘liq tushunchalar
Message broker, Acknowledgement, Retry, Duplicate request, Idempotent consumer, Dead-letter queue