Asosiy kontentga o‘tish
Innovialabs

Mavjud bo‘lmagan tovarni sotmaslik: zaxiralash strategiyalari

Chuqur4 daq

Qisqacha

Ko‘pchilik do‘konlar uchun ishonchli standart variant — tovarni buyurtma rasmiylashtirilayotganda qisqa taymaut bilan zaxiralash, qoldiqni bazada atomar kamaytirish va barcha savdo kanallari uchun yagona qoldiq hisobini yuritish.

Qisqa javob

Mavjud bo‘lmagan tovarni sotish (overselling) ikki xaridor bitta oxirgi donani olganda yoki marketpleys saytda allaqachon sotilgan tovarni ko‘rsatib turganda yuz beradi. Bundan uchta narsa himoya qiladi:

  • Zaxiralash modeli — dona qaysi paytda boshqalar uchun mavjud bo‘lmay qolishini belgilaydi.
  • Qoldiqlar bilan atomar operatsiyalar — ikkita parallel so‘rov bitta donani bir vaqtda hisobdan chiqara olmaydi.
  • Yagona qoldiq hisobi — barcha kanallar bitta joydan o‘qiydi va bitta joyga yozadi.

Ko‘pchilik do‘konlar uchun muvozanatli variant — 10-20 daqiqalik taymaut bilan rasmiylashtirishda zaxiralash. Aniq qiymat to‘lovingiz real qancha davom etishiga bog‘liq.

Uchta zaxiralash modeli

ModelTovar qachon ushlab turiladiAfzalliklariKamchiliklari
Savatchada zaxiraSavatchaga qo‘shilgandaXaridor to‘lovda tovarni yo‘qotmaydiTashlab ketilgan savatchalar qoldiqni band qiladi, suiiste’mol qilish oson
Rasmiylashtirishda zaxiraCheckout boshlangandaMuvozanat: tovar faqat jiddiy xaridorlar uchun ushlanadiTaymautlar va bo‘shatish vazifasi kerak
To‘lovdan keyin zaxiraTo‘lov tasdiqlangandaBand qilingan qoldiq yo‘q, mantiq oddiyIkki kishi bitta dona uchun to‘lashi mumkin, biriga pul qaytariladi

Savatchada zaxira flesh-chegirmalar va cheklangan partiyalar uchun mos, bu yerda oxirgi qadamda tovarni yo‘qotish qabul qilinmaydi. Qisqa savatcha taymauti va bitta xaridorga miqdor limitidan foydalaning.

Rasmiylashtirishda zaxira ko‘pchilik katalog do‘konlariga mos: xaridor manzil kiritib, to‘lov qilayotganda tovar ushlab turiladi.

To‘lovdan keyin zaxira katta qoldiqlar, raqamli tovarlar va buyurtma asosida tayyorlanadigan mahsulotlar uchun mos, chunki to‘qnashuvlar kam bo‘ladi. Ammo kamdan-kam uchraydigan ikki marta sotish holati uchun reja baribir kerak: avtomatik pul qaytarish va xaridorga xabar.

Zaxira taymautlari

Muddatsiz zaxira — qoldiqlarning sekin «oqib ketishi». Har bir zaxiraga quyidagilar kerak:

  • expires_at maydoni — zaxira yaratilganda belgilanadi.
  • Bo‘shatish mexanizmi: muddati o‘tgan zaxiralarni olib tashlaydigan fon vazifasi yoki qoldiq o‘qilganda «dangasa» tozalash.
  • Uzaytirish qoidalari: xaridor to‘lov shlyuziga yo‘naltirilsa, zaxirani shlyuz sessiyasidan uzoqroq muddatga uzaytiring.
  • Kechikkan to‘lov qoidasi: to‘lov tasdig‘i zaxira muddati tugagandan keyin kelsa nima qilinadi. Odatda qayta zaxiralashga urinib ko‘riladi, tovar qolmagan bo‘lsa — pul avtomatik qaytariladi.

Zaxiralarni kamaytirib qo‘yib unutiladigan hisoblagich sifatida emas, alohida yozuvlar sifatida saqlang. Shunda kim nimani ushlab turganini ko‘rasiz va zaxirani aniq olib tashlay olasiz.

Parallel so‘rovlarni boshqarish

Klassik xato: qoldiqni o‘qish (1 dona qoldi), tekshirish, keyin yozish. Ikkita so‘rov bir vaqtda «1» ni o‘qiydi va ikkalasi ham sotadi. Buni ma’lumotlar bazasi darajasida hal qilish kerak.

Eng oddiy ishonchli usul — shartli atomar yangilash:

UPDATE stock
SET available = available - :qty,
    reserved  = reserved + :qty
WHERE sku = :sku AND available >= :qty;
-- 0 ta qator o‘zgardi = tovar yetarli emas

Boshqa variantlar:

  • Yozishdan oldin bir nechta tekshiruv kerak bo‘lsa, tranzaksiya ichida qatorlarni bloklash (SELECT ... FOR UPDATE). Deadlock bo‘lmasligi uchun qatorlarni har doim bir xil tartibda bloklang.
  • Versiya ustuni orqali optimistik bloklash: versiya o‘zgargan bo‘lsa — qayta urinish.
  • Juda yuqori yuklama uchun Redis’dagi atomar operatsiyalar (masalan, Lua-skript), baza esa ishonchli ombor bo‘lib qoladi.

Zaxira yaratish va to‘lov kolbeklarini qayta ishlashni idempotent qiling. Shlyuzlar vebhuklarni qayta yuboradi va takroriy kolbek qoldiqni ikki marta kamaytirmasligi kerak.

Bir nechta kanaldagi qoldiqlar

Saytda, oflayn do‘konda va marketpleyslarda sotganingizda har bir kanalda qoldiqlarning sinxronizatsiya kechikishi bilan o‘z nusxasi bo‘ladi. Ular farqlanib ketmasligi uchun:

  • Bitta hisob — haqiqat manbai: sizning bazangiz, ERP yoki 1C, marketpleys emas.
  • O‘zgarishlarni har bir harakatda yuboring, sutkada bir marta emas. Marketpleyslarning qoldiqni yangilash API’si va navbatdan foydalaning.
  • Kanallar bo‘yicha xavfsizlik buferini saqlang: sinxronizatsiyasi sekin kanallarda real qoldiqdan biroz kamroq ko‘rsating.
  • Tanqis tovarni taqsimlang: kam tovarlar uchun umumiy pul o‘rniga kanallarga qat’iy kvotalar ajrating.
  • Buyurtmalarni tez oling: marketpleysdagi buyurtma imkon qadar tez sizning hisobingizda zaxira yaratishi kerak.

Keng tarqalgan xatolar

  • Atomar yozuvsiz ilova kodida qoldiqni tekshirish.
  • Katalogni asta-sekin «muzlatib» qo‘yadigan muddatsiz zaxiralar.
  • Hisobotlarda «savatchadagi» tovarlarni sotilgan deb hisoblash.
  • Tez sotiladigan tovarlar uchun marketpleys qoldiqlarini kuniga bir marta sinxronlash.
  • Zaxira muddati tugagandan keyin kelgan to‘lov uchun ssenariy yo‘qligi.

Ko‘p beriladigan savollar

Rasmiylashtirishda zaxiralash va real to‘lov vaqtini qoplaydigan taymautdan boshlang. Shunda to‘lov qilayotgan xaridorlarni himoya qilasiz va tashlab ketilgan savatchalarda tovarni muzlatib qo‘ymaysiz.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.