Dilshod.dev

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.

Muallif: Dilshod Abdullayev3 daqiqa o'qish

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_MODEshadow 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?

O'xshash maqolalar

architecturepayments

Idempotentlik — bu header emas. Bu shartnoma.

Har bir to'lov provayderi webhook'ingiz idempotent bo'lishini talab qiladi. Buning aslida nima talab qilishini deyarli hech kim aytmaydi — bu identifikatsiya haqidagi qaror, holat haqidagi qaror va dalilni qo'yadigan joy.

5 daqiqa o'qish
system-designbackend

Ikki marta yechilgan to'lov

Qayta urinish takroriy so'rov emas — to'lov ikki marta o'tib ketguncha. Idempotentlik kalitlari aslida qanday ishlaydi, sodda variant nega baribir ikki marta yechadi va qaysi Postgres cheklovi kafolatni haqiqiy qiladi.

7 daqiqa o'qish
backendnodejs

Qulashdan omon chiqadigan background job'lar

Deploy worker'larni ish o'rtasida qayta ishga tushirdi va xatlar shunchaki yo'q bo'ldi. O'lgan jarayon ma'lumot yo'qotish emas, shunchaki kechikish bo'ladigan queue qanday quriladi.

11 daqiqa o'qish