Soya rejimi: kodni ishonishdan oldin isbotlash
Joytop'dagi yangi to'lov tasdiqlash kodi bir hafta productionda soya rejimida ishladi — qaror qabul qilmasdan, faqat kuzatib. Ertaga u yagona qaror qiluvchiga aylanadi. Soya rejimi nima, u nimadan himoya qiladi va nega uni kuzatuvsiz yoqib qo'yib bo'lmaydi.

Bir hafta. Shuncha vaqt yangi to'lov tasdiqlash kodim Joytop'da productionda ishladi — va bironta ham foydalanuvchi buni sezmadi, chunki u hech narsani hal qilmasdi. Faqat kuzatib turardi.
Ertaga, 2026-09-14 da, shu kodni "hal qiluvchi" holatga o'tkazaman. Bitta muhit o'zgaruvchisi: PAYMENTS_CONFIRM_MODE — shadow dan enforce ga.
Nega bitta service uchun bunchalik ehtiyot
Joytop'da uchta to'lov provayderi bor — Payme, Click, Alfabank/E-Comm. Har biri o'z webhook formati, o'z xato holatlari, o'z takrorlash xulq-atvori bilan keladi. Ular ustidan bitta PaymentProcessorService ishlaydi — to'ldirish, obuna, e'lon, eSIM, hammasi shu orqali o'tadi.
Men shu servisning to'lovni tasdiqlash qismini qayta yozdim: bitta ConfirmPaymentService, summani tekshiradigan PAYMENTS_AMOUNT_CHECK bayrog'i bilan. Eski kod ishlab turgan, pul tegib turgan joyda ishlaydi. Yangisi undan yaxshiroq — lekin "yaxshiroq deb o'ylayman" bilan "yaxshiroq ekanini bilaman" orasida katta masofa bor, va bu masofani productionning pulida yopib bo'lmaydi.
Soya rejimi nima qiladi
G'oya sodda: yangi kod eski kod bilan bir vaqtda ishlaydi, lekin qaror qabul qilmaydi.
Har bir webhook kelganda, ikkala yo'l ham ishga tushadi. Eski PaymentProcessorService — hozirgidek — to'lovni tasdiqlaydi, holatni yozadi, foydalanuvchiga javob beradi. Yangi ConfirmPaymentService esa parallel ravishda o'zi qanday qaror qilgan bo'lardi — tasdiqlaydimi, rad etadimi, qancha summani ko'radi — hammasini payment_events jadvaliga yozadi. Lekin natijani hech kimga bermaydi. Uni hech kim kutmaydi.
Ya'ni ikkita savolga bir vaqtda javob olaman: yangi kod ishga tushganda qulaydimi (loglardan ko'rinadi), va ishga tushganda eski kod bilan bir xil xulosaga keladimi (payment_events dagi ikki qatorni solishtirib).
Kuzatuv kerak, umid emas
Shu yerda ko'pchilik loyiha xato qiladi: shadow rejimni yoqib qo'yib, "bir hafta o'tsin, keyin flip qilamiz" deb unutib qo'yadi. Farq bo'lsa ham hech kim ko'rmaydi, chunki farqni ko'rsatadigan hech narsa yo'q.
09-07 da shu uchun alohida cron qo'ydim: har necha daqiqada payment_events dagi eski va yangi natijalarni solishtiradi, mos kelmasa Telegram'ga xabar yuboradi. Bir hafta davomida bitta xabar ham kelmadi — bu "hammasi joyida" degani emas, "hozirgacha aniqlangan farq yo'q" degani. Ikkalasi bir xil emas, va bu farqni eslab qolish kerak.
Ma'nosi
Soya rejimi tezlik uchun emas — u sekinroq. Bir hafta kutish, cron yozish, ikkita yo'lni parallel yuritish — hammasi qo'shimcha ish. Buni to'g'ridan-to'g'ri o'zgartirib, "test o'tdi, deploy qilaman" deb ham bo'lardi.
Ma'nosi: men yangi kodga ishonaman deganim bilan, u haqiqiy pul ustida sinalmagan. Shadow rejim — shu ikkisi orasidagi farqni pulsiz yopadigan yagona yo'l.
Ertaga flip qilaman. Bir hafta jim turgan cron nihoyat ovozini chiqaradi — yoki chiqarmaydi. Ikkalasi ham javob.
Siz oxirgi marta productionda "ishonaman" bilan "bilaman" orasidagi farqni qanday yopgandingiz?
Ruknlar


