NATS JetStream hodisasi tahlili

NATS JetStream hodisasi tahlili

1. Umumiy ko‘rinish

MSA (Microservice Architecture) asosidagi ilovalar bitta katta tizimni bir nechta mustaqil xizmatlarga ajratish orqali tuziladi. Har bir xizmat turli funksiyalar va mas’uliyatlarga ega, biroq amaliy xizmatlarni taqdim etish uchun xizmatlar o‘rtasida ma’lumot uzatish va holatni ulashish davom etishi kerak. Xabar almashish xizmatlar o‘rtasida qo‘llaniladigan aloqa usullaridan biridir, asinxron ma’lumot yetkazib berish talab etilganda esa xabar brokeridan foydalanish mumkin.

Project A bir nechta xizmatlar o‘rtasida kema bortidagi sensor ma’lumotlari va hodisa ma’lumotlarini ishonchli hamda samarali yetkazib berish uchun NATS asosidagi doimiy xabar almashish tizimi — NATS JetStream’dan foydalanadi. NATS JetStream xizmatlar o‘rtasida nafaqat asinxron xabar yetkazib berishni, balki xabarlarni saqlash, Consumer holatini boshqarish va xabarlarni qayta yetkazib berishni ham qo‘llab-quvvatlaydi. Shu orqali uzluksiz hosil bo‘ladigan kema ma’lumotlarini ishonchli qayta ishlash imkonini beradi.

Biroq amaliy ishlab chiqish va ishlatish jarayonida kema serverining majburiy o‘chirilishi va ilovaning noodatiy tarzda tugatilishi kabi turli holatlar yuz beradi. Bunday muhitlarda NATS JetStream bilan bog‘liq kutilmagan nosozliklarga tez-tez duch keldik. Ushbu maqolada NATS JetStream’dan foydalanish vaqtida yuzaga kelgan nosozlik holatlariga asoslanib, asosiy sabablarni tahlil qilamiz hamda kelajakda shu kabi nosozliklarni aniqlash va ularga javob berish uchun Consumer holati qiymatlariga asoslangan diagnostika tartibini bayon qilamiz.

2. Xabarlarni qayta ishlashdagi nosozliklarning yuzaga kelishi

Majburiy o‘chirish kabi noodatiy o‘chirishdan so‘ng server qayta ishga tushirilganda, xabarlar Stream’ga Published qilinishda davom etayotgan bo‘lsa ham, Durable Consumer xabarlarni to‘g‘ri qabul qila olmaydigan holat yuz berdi.

Ishga tushirilganda, ushbu ilova mavjud Durable Consumer bor-yo‘qligini tekshiradi. Agar Consumer allaqachon mavjud bo‘lsa, yangisini yaratish o‘rniga mavjud Consumer’dan qayta foydalanadi. Durable Consumer nafaqat obuna ma’lumotlarini, balki xabarlar qanchagacha yetkazilganini ko‘rsatuvchi Delivered Sequence, tasdiqlashlar qaysi nuqtagacha yakunlanganini ko‘rsatuvchi Ack Floor, hali tasdiqlanmagan xabarlar holati va qayta yetkazilishi mo‘ljallangan xabarlarni o‘z ichiga olgan iste’mol holatini ham uzluksiz saqlaydi. Shu sababli, xabarlarni qayta ishlash vaqtida server majburan tugatilsa, ayrim xabarlar uchun Ack qayta ishlanishi yakunlanmasligi yoki Consumer’ning yetkazib berish va qayta ishlash holati tugallanmagan holda qolishi mumkin.

Server qayta ishga tushirilgach, ilova mavjud Durable Consumer’dan qayta foydalanishda davom etadi va shu sababli noodatiy tugatilishdan oldin qolib ketgan xabarlarni qayta ishlash holatini ham meros qilib oladi. Normal sharoitda qayta ishlanmagan xabarlar AckWait va qayta yetkazib berish siyosatiga muvofiq yana yetkazilishi, shundan so‘ng xabarlarni iste’mol qilish davom etishi kerak. Biroq turli holatlarga, masalan, to‘planib qolgan Ack Pending xabarlariga yoki Delivered Sequence va Ack Floor oralig‘idagi qayta ishlash holatining to‘g‘ri davom etmasligiga qarab, Consumer tomonidan xabarlarni yetkazib berish kechikishi yoki to‘xtashi mumkin.

3. Consumer holati qiymatlarini tahlil qilish usuli

Nosozlik yuz berganda, avvalo Consumer holati haqidagi ma’lumotlarni tekshiring va nosozlik qaysi bosqichda yuz berganini aniqlang.

Information for Consumer “stream” > “consumer”

Configuration:
    Name: “consumer”
    Pull Mode: true
    Filter Subject: subject.>
    Deliver Policy: All
    Ack Policy: Explicit
    Ack Wait: 30s
    Maximum Deliveries: 3
    Maximum Ack Pending: 1000
State:
    Last Delivered Message:
        Consumer sequence: 15230
        Stream sequence: 185400

    Acknowledgment Floor:
        Consumer sequence: 14230
        Stream sequence: 184400

    OutStanding Acks: 1000
    Redelivered Messages: 15
    Unprocessed Messages: 3270
    Waiting Pulls: 1

Element

Ma’nosi

Nimani tekshirish kerak

Last Delivered Message

Consumer xabarlarni qanchagacha yetkazib bergani

Muayyan Sequence’da uzoq vaqt to‘xtab qolgan-qolmaganini tekshiring

Acknowledgment Floor

Tasdiqlashlar qaysi nuqtagacha uzluksiz yakunlangani

Last Delivered’dan farq haddan tashqari katta-katta emasligini tekshiring

OutStanding Acks

Yetkazib berilgan, biroq hali tasdiqlanmagan xabarlar soni

Maximum Ack Pending qiymatiga yetgan-yetmaganini tekshiring

Qayta ishlanmagan xabarlar

Hali Consumer’ga yetkazib berilmagan xabarlar soni

Qiymat 0 dan katta bo‘lsa ham iste’mol jarayoni davom etmayotganini tekshiring

Qayta yetkazilgan xabarlar

Qayta yetkazilgan xabarlar soni

Server qayta ishga tushirilgandan so‘ng noodatiy ravishda oshayotgan-oshmayotganini tekshiring

Waiting Pulls

Hozirda xabar so‘rab, kutayotgan Pull so‘rovlari soni

Agar 0 bo‘lsa, ilovaning Pull sikli ishlamayotgan bo‘lishi mumkinligini tekshiring

  • 1-jadval. Consumer holatining asosiy qiymatlari va ularning ma’nolari

1) OutStanding Acks MaxAckPending qiymatiga yetganda

OutStanding Acks — Consumer ilovaga yetkazib bergan, biroq hali Ack olmagan xabarlar sonini anglatadi. Ushbu qiymat MaxAckPending sozlamasiga yetganda, Ack qayta ishlanib, sig‘im bo‘shaguniga qadar JetStream yangi xabarlarni yetkazib berishni cheklashi mumkin.

Maximum Ack Pending:  1000
OutStanding Acks:     1000
Unprocessed Messages: 3270

Yuqoridagi misolda Stream’da hali 3270 ta xabar qolgan, biroq Consumer ruxsat etilgan Ack Pending chegarasigacha bo‘lgan xabarlarni allaqachon yetkazib bergan. Shu sababli, agar Ack’lar ilova tomonidan qayta ishlanmasa, qo‘shimcha xabarlar yetkazib berilmaydi. Natijada tashqi tomondan Publish jarayoni odatdagidek ko‘rinsa ham, Consumer hech qanday xabar qabul qilmaydigan holat yuzaga kelishi mumkin.

2) Pull so‘rovlari to‘g‘ri amalga oshirilmaganda

Pull Consumer xabarlarni faqat ilova fetch() yoki consume() yordamida Pull so‘rovlarini yuborgandagina yetkazib beradi. Shu sababli, yetkazib berilishi kerak bo‘lgan xabarlar qolgan bo‘lsa-yu, Waiting Pulls 0 bo‘lib qolsa, muammoni Consumer’ning o‘zidan ko‘ra ilovaning Pull’ni qayta ishlash mantiqidan izlash mumkin.

Unprocessed Messages: 3270
OutStanding Acks:      0
Waiting Pulls:         0

Yuqoridagi holatda xabarlarni yetkazib berish Ack’lar tufayli bloklanmagan, biroq xabar so‘rayotgan Pull so‘rovlari mavjud emas. Server qayta ishga tushirilgandan so‘ng Pull’ni qayta ishlash Thread’i yoki consume() sikli to‘g‘ri ishga tushganini hamda NATS qayta ulangandan keyin Subscription to‘g‘ri tiklanganini tekshiring.

3) Last Delivered va Ack Floor uzoq vaqt davomida siljimaganda

Last Delivered Consumer xabarlarni qanchagacha yetkazib berganini, Ack Floor esa tasdiqlashlar qaysi nuqtagacha uzluksiz yakunlanganini ko‘rsatadi. Ikki qiymat o‘rtasidagi farqning o‘ziga e’tibor qaratishdan ko‘ra, vaqt o‘tishi bilan ikkala qiymat ham umuman o‘zgarmayotganini tekshirish muhim.

Last Delivered Stream Sequence: 185400
Ack Floor Stream Sequence:      185380
OutStanding Acks:               20
Unprocessed Messages:           3270


\n Agar Last Delivered bir necha soniya yoki daqiqa davomida 185400 qiymatida qolsa, Unprocessed Messages esa oshishda davom etsa, Consumer’ning iste’mol oqimi to‘xtab qolgan bo‘lishi mumkin. Bunday holatda muammo Consumer’dami yoki ilovadagi qayta ishlash jarayonidami — buni ajratish uchun Waiting Pulls, Redelivered Messages va ilova jurnallarini birgalikda tekshiring.

Ushbu nosozlik holatlarida mavjud Durable Consumer o‘chirilib, yangi Consumer yaratish uchun ilova qayta ishga tushirilgandan so‘ng xabarlarni iste’mol qilish odatdagidek davom etdi. Bu muammo Publisher yoki Stream’ning o‘zidan emas, balki noodatiy tugatilishdan oldin mavjud Durable Consumer tomonidan saqlab qolingan holat xabarlarni iste’mol qilishga ta’sir qilganini tasdiqladi.

Shundan so‘ng server qayta ishga tushganda mavjud Consumer’ni o‘chirib, qayta yaratadigan va shu orqali xabar almashish tizimi holatini boshlang‘ich holatga keltiradigan tiklash skriptini yaratdik. Bu kema bortidagi NATS JetStream bilan bog‘liq nosozliklarni kamaytirishga yordam berdi.

4. Xulosa

Amaliy ishlash muhitlarida NATS JetStream’da xabarlarni qayta ishlash serverning kutilmaganda majburiy o‘chirilishi yoki ilovaning noodatiy tarzda tugatilishi kabi holatlar sababli muvaffaqiyatsiz yakunlanishi mumkin. Xususan, xabarlarni qayta ishlash xizmatlar o‘rtasida ma’lumot uzatish bilan bog‘liq asosiy funksiya hisoblanadi. Shu sababli nosozlik yuz berganda uning sababini tezda aniqlash va tegishli choralarni ko‘rish muhimdir.

Shu sababli, kelajakda shunga o‘xshash nosozliklar yuz berganda, ushbu maqolada bayon qilingan asosiy Consumer holati qiymatlari va holatga qarab tahlil qilish usullari asosida ularning sabablarini tezda aniqlash va tegishli choralarni ko‘rish zarur. Bu xizmatning ishlamay qolish vaqtini minimallashtirish va barqaror ishlashni ta’minlash imkonini beradi.

deeeneee

Site footer