Idempotency key — mijoz mantiqan bitta operatsiyaga tegishli barcha qayta urinishlarda bir xil yuboradigan takrorlanmas identifikator. Server kalitni so‘rov va uning natijasi bilan bog‘lab, birinchi bajarishdan keyingi nusxalarni qayta ishlamaslik yoki oldingi natijani qaytarish orqali to‘lov, buyurtma va boshqa qaytarib bo‘lmaydigan amallarning takrorlanishini cheklaydi.
So‘rovni qayta urinish muammosi
Mijoz serverga buyurtma yaratish so‘rovini yuboradi. Server buyurtmani bazaga yozadi, ammo javob tarmoqda yo‘qoladi. Mijoz timeout ko‘radi va ayni so‘rovni yana yuboradi. Oddiy POST endpoint har urinishni yangi amal deb qabul qilsa, ikkita buyurtma hosil bo‘ladi. Mijoz birinchi urinish bajarilgan-bajarilmaganini tarmoq javobidan aniqlay olmaydi.
Mijoz operatsiya boshlanishida tasodifiy, yetarli darajada noyob kalit yaratib, masalan Idempotency-Key sarlavhasida yuboradi. Qayta urinishda yangi kalit yasamaydi. Yangi foydalanuvchi amali esa boshqa kalit oladi. Shu farq serverga tarmoq takrorini haqiqiy yangi buyruqdan ajratish imkonini beradi.
Serverdagi qayta ishlash
Sodda model quyidagi bosqichlardan iborat:
- Kalitning formati va mijozga tegishliligi tekshiriladi.
- Kalit uchun avvalgi yozuv atomik qidiriladi yoki yaratiladi.
- Yangi kalit bo‘lsa, operatsiya bajarilib, status va muhim javob saqlanadi.
- Tugallangan kalit qayta kelsa, saqlangan natija qaytariladi.
- Ayni kalit bilan boshqa parametrlar kelsa, server konflikt xatosi beradi.
Kalit odatda global emas, akkaunt yoki API iste’molchisi doirasida noyob qilinadi. So‘rovning semantik parametrlaridan hash saqlash bir xil kalitning tasodifan boshqa buyurtma uchun qayta ishlatilishini aniqlaydi. Faqat kalit borligini tekshirib, so‘rov mazmunini solishtirmaslik noto‘g‘ri natijani yangi amal javobi sifatida qaytarishi mumkin.
Parallel so‘rovlar va atomiklik
Bir xil kalitli ikki so‘rov bir vaqtda serverga yetishi mumkin. “Avval qidir, keyin yoz” jarayoni tranzaksiyasiz bajarilsa, ikkala worker ham kalit mavjud emasligini ko‘rib, amalni ikki marta boshlaydi. Buni kalit ustidagi unique constraint, atomik insert, bloklash yoki holat mashinasi bilan oldini olish kerak.
Kalit yozuvi processing, completed va failed kabi holatlarni saqlashi mumkin. Ikkinchi so‘rov birinchisi hali ishlanayotganini ko‘rsa, kutishi, “jarayon davom etmoqda” javobini berishi yoki keyin qayta urinishni so‘rashi mumkin. Birinchi worker operatsiya o‘rtasida to‘xtasa, kalit va domen tranzaksiyasi orasidagi muvofiqlik hal qilinadi; aks holda yozuv “processing” holatida qolib ketadi yoki bajarilgan amal natijasiz ko‘rinadi.
Saqlash muddati va javob semantikasi
Idempotency yozuvlari odatda cheklangan muddat saqlanadi. Muddat mijozlarning eng uzun qonuniy retry oynasi, xabar navbati kechikishi va operatsiyaning xavfiga qarab tanlanadi. Kalit o‘chirilgandan keyin ayni so‘rov qaytsa, server uni yangi amal deb bajarishi mumkin; bu API shartnomasida ko‘rsatilishi lozim.
Birinchi urinishdagi barcha xatolarni saqlash har doim ham to‘g‘ri emas. Validatsiyadan o‘tmagan va domen amali boshlanmagan so‘rov tuzatilib qayta yuborilishi mumkin. Aksincha, amal bajarilib, faqat javob yaratishda xato yuz bergan bo‘lsa, takroriy bajarish xavfli. Qaysi bosqichdan boshlab kalit “sarflangan” hisoblanishi tranzaksiya chegarasi bilan belgilanadi.
Qo‘llanish chegaralari
Idempotency key autentifikatsiya o‘rnini bosmaydi va kalitni bilgan har kim operatsiyani ko‘ra olishi kerak degani emas. Har so‘rov odatdagi ruxsat tekshiruvlaridan o‘tadi, kalit esa tegishli mijoz doirasida izlanadi. Kalit tarkibiga karta raqami yoki shaxsiy ma’lumot qo‘yilmaydi; jurnal va monitoringda u texnik identifikator sifatida saqlanadi.
Bu mexanizm aynan takroriy so‘rovni boshqaradi, biznes darajasidagi barcha dublikatlarni emas. Foydalanuvchi bir tugmani ikki marta bosib, har safar yangi kalit yaratsa, server ikki alohida operatsiya ko‘radi. Bunday holat uchun buyurtma raqami, domen unique constrainti yoki alohida biznes qoidasi ham zarur bo‘lishi mumkin.
Bog‘liq tushunchalar
Idempotent operation, Retry, Duplicate request, POST, Unique constraint, Transaction