+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify inventar zaxiralarini MySQL ga ko'chirdi

Shopify o'zining inventar zaxirasi tizimini Redis'dan inventar hisobini allaqachon o'z ichiga olgan MySQL ma'lumotlar bazasiga ko'chirdi.

Shopify o'zining inventar zaxirasi tizimini Redis'dan inventar hisobini allaqachon o'z ichiga olgan MySQL ma'lumotlar bazasiga ko'chirdi. Individuallashtirilgan qulflanadigan birlik qatorlarining cheklangan to'plami bir vaqtning o'zida amalga oshiriladigan xaridlar uchun mos birliklarni tanlash maqsadida SKIP LOCKED'dan foydalanish imkonini beradi. Dizayn, shuningdek, tranzaksiya chegaralari, boshlang'ich kalit tartibi, to'ldirish qoidalari va xarid davomida ulanishni ushlab turish vaqtini kuzatishga ham bog'liq.

Yozma nashrini oʻqing (inglizcha) ↗

Bu video nimani qamrab oladi

  • Eski Redis miqdor-hisoblagich modeli bir vaqtning o'zida ishlashni ta'minladi, ammo zaxiralarni tozalash va MySQL hisobi yangilanishi bitta mahalliy atomik tranzaksiyani baham ko'ra olmadi.
  • O'zgartirish har bir mahsulot/joylashuv kombinatsiyasi uchun 1000 tagacha cheklangan havzadagi har bir mavjud birlik uchun bitta qatordan foydalanadi. Bo'sh havza bir vaqtning o'zida so'rovlar to'ldirish qulfi ortida kutayotgan holda joyida to'ldirishni ishga tushirishi mumkin.
  • Murakkab birlamchi kalit (shop_id, inventory_item_id, inventory_group_id, id) hisoblanadi. Shopify o'z prototipida qulfning yukini kamaytirdi va to'ldirishni bloklagan bo'shliq qulflarini oldini olish uchun READ COMMITTED dan foydalangan.
  • Zaxiralash yozuvlarini kiritishdan oldin havza qatorlarini o'chiradi. Tasdiqlash ma'lumotlar bazasi qulflarini bo'shatadi, saqlangan ushlab turish to'lov jarayonida saqlanadi; muvaffaqiyatli to'lov hisobni tasdiqlaydi va keyingi atomik tranzaksiyada zaxirani olib tashlaydi.
  • MySQL SKIP LOCKED ni qulflangan qatorlarni qoldirib ketadigan nomuvofiq ko'rinish sifatida hujjatlashtiradi. U to'liq zaxira hisobini yoki adolatli navbatni ta'minlamaydi, faqat qator darajasidagi qulflarga taalluqlidir va bayonotga asoslangan replikatsiya uchun xavfsiz emas.
  • Manba misolida expires_at kiritilgan, ammo Shopify MySQL ning amal qilish muddatini tozalash algoritmini hujjatlashtirmagan. Videodagi chiqarish/muddatining tugashi shartlari tushuntirish xususiyatiga ega hayotiy sikl talabidir.
  • Boshqa xarid kodidagi ulanishni ushlab turish vaqti oxirgi o'tkazish qobiliyatini cheklovchi omil bo'ldi. Shopify ikkala tizimni ham yozuvlar bilan kuzatdi, natijalarni solishtirdi va Redis kill-switch zaxira tizimi bilan asta-sekin o'tdi.

Tarjima qilingan transkript

Asl inglizcha hikoyadan tarjima qilingan. Mavjud audio va subtitrlar YouTube tomonidan boshqariladi.

Nima uchun zaxiralarni MySQL ga o'tkazish kerak?

0:00 Tez ishlashi uchun xarid Redisga muhtoj. Shopify inventar zaxiralarini MySQLga ko'chirdi, bunda har bir birlik uchun bitta qator ishlatilgan. cheklangan havza. Nima uchun MySQL ni tanlaysiz? Qulflarni qanday qilib xavfsiz o'tkazib yuborish mumkin? Bu The Daily Diff, ichki tomondan. Va nima uchun tezkor so'rovlar hali ham cheklovga uchradi? Shopify - onlayn va shaxsan sotish uchun tijorat platformasi. Redis - xotirada joylashgan ma'lumotlar ombori.

0:21 MySQL - relyatsion ma'lumotlar bazasi va Shopify o'z inventar hisobini allaqachon saqlagan edi. u yerda. Zaxira xaridor to'laguncha qisqa vaqt ichida zaxirada ushlab turadi.

Nima uchun ikkita do'kon xavfli edi?

0:29 Ularning Redis modeli element hisoblagichini kamaytirdi. To'langan buyurtmani tasdiqlash MySQL hisobini yangilash va Redisni tozalashni anglatardi. Bu alohida yozuvlar zaxirani ikki marta sotilgan yoki sotilishi kerak bo'lganda mavjud emasligini qoldirishi mumkin edi. bo'lishi kerak. Eski modelda joylashuvni aniqlash ham yo'q edi. Almashtirish buyurtmani qondira oladigan joydan zaxirani tanlashi kerak. Noto'g'ri qit'adagi ombor ajoyib ma'lumotlar bazasi yozuvi va dahshatli yetkazib berish va'dasi bo'ladi. dahshatli yetkazib berish va'dasi. Avvalgi MySQL urinishlari miqdor qatoridan foydalangan, shuning uchun raqobatdosh xaridlar bir xil qulfda navbatga turgan.

Qulfga olinadigan birlik nima bo'ladi?

0:56 Bir jadvallar katagi atrofidagi baxmal arqonni tasavvur qiling. Ko'proq ishchilarni qo'shish shunchaki navbatni uzaytiradi. Shopify qulflanadigan obyektni o'zgartirdi. Har bir mavjud birlik o'z qatorini oladi. Qulfni o'quvchi boshqa tranzaksiya ushlab turgan birliklarni o'tkazib yuboradi va boshqa mos keluvchi birliklarni tanlaydi. boshqa tranzaksiya ushlab turgan birliklarni o'tkazib yuboradi va boshqa mos birliklarni tanlaydi. Har xil ishchilar har xil qatorlarni olishlari mumkin, qaynoq hisoblagich ularning yo'lida turmasdan.

Havza bo'shaganda nima sodir bo'ladi?

1:15 Bu havza har bir mahsulot va joylashuv uchun mingta qator bilan cheklangan. To'ldirish hisobdan olinadi. Agar u bo'shab qolsa, zaxira yo'li joyida to'ldiriladi, raqobatdosh so'rovlar to'ldirish qulfi ortida kutadi. Bo'sh havza bo'sh omborni anglatmaydi. Zaxira tanlangan havza qatorlarini o'chiradi, so'ngra tranzaksiyada zaxira yozuvlarini kiritadi. Tasdiqlash ma'lumotlar bazasi qulflarini bo'shatadi.

1:35 Bekor qilish o'zgarishlarni bekor qiladi. Zaxira to'lovni qayta ishlashdan omon qoladi, chunki u saqlangan holatdir. Muvaffaqiyatli to'lov hisobni tasdiqlaydi va zaxirani atomik tarzda olib tashlaydi. Ma'lumotlar bazasi qulflari hech qachon to'lov shaklini nazorat qilishga muhtoj emas. Ularning kompozit birlamchi kaliti do'kon, mahsulot, guruh, keyin birlik identifikatoridan boshlanadi. Qidiruvni moslashtirish ularning prototipida indeks qulflanishini kamaytirdi. Ular, shuningdek, havzani to'ldirishni bloklagan bo'shliq qulflarini oldini olish uchun READ COMMITTED dan foydalanganlar va doimiy jadval tartibidan foydalanganlar,

1:57 va doimiy jadval tartibini aylana kutishlarning oldini olish uchun ishlatganlar. Nashr qilingan misolda amal qilish vaqti qayd etilgan. Tark etilgan to'lovlar zaxirani oxir-oqibat bo'shatishi kerak, aks holda savat ijarachiga aylanadi. Shopify ning posti ushbu tozalash algoritmini aniqlamagan, shuning uchun ushbu diagramma hayotiy sikl talabini ko'rsatadi. Mana muammo.

SKIP LOCKED nimani chetda qoldiradi?

2:14 Qulfdan o'tkazish qulflangan qatorlarni chiqarib tashlaydi, shuning uchun qo'llanma uning natijasini nomuvofiq ko'rinish deb ataydi. U na to'liq zaxira hisobini, na adolatli navbatni ta'minlaydi. Mavjudlik qarori va to'ldirish qoidalarini uning atrofida saqlang.

Haqiqiy chegara qayerda edi?

2:26 Va u chegara? Boshqa xarid kodi ma'lumotlar bazasi ulanishlarini juda uzoq ushlab turgan. Shopify chaqiruvchilarni belgiladi va ulanishni ushlab turish vaqtini o'lchadi, keyin xarid yo'lini tozaladi va ishlov berishning bir vaqtda bajarilishini qayta ko'rib chiqdi. Tezkor so'rovlar hali ham so'rovdan tashqarida navbatga turishi mumkin.

Nima uchun men bu dizaynni jo'natishim kerak?

2:38 Ular ikkala tizimni ham Redis asosiy bo'lgan holda soya-yozuv qildilar, natijalarni solishtirdilar, so'ngra kill switch bilan asta-sekin o'tdilar. Mening hukmim SHIP IT. Men umumiy tranzaksiya chegarasini va o'sha bekor qilinadigan chiqarishni jo'natardim, butun xarid yo'li asbob-uskunalar bilan jihozlangan holda. Bu haqida savolingiz bormi? Uni izohlarga yozing. Va bugungi farq shu.

2:54 Men Axrisi'dan Nikoman. Mas'uliyat bilan birlashtiring.

Manbalar

  1. We replaced Redis with MySQL for inventory reservations—and it scaledShopify Engineering — Emilie Noel
  2. Simplified reservation SQL embedded in Shopify's articleShopify Engineering / CourtneySymons on GitHub Gist
  3. MySQL 8.0 — Locking ReadsOracle / MySQL Reference Manual
  4. MySQL 8.0 — Transaction Isolation LevelsOracle / MySQL Reference Manual
  5. What Is Shopify and How Does It Work?Shopify
  6. Redis quick startsRedis documentation
  7. What is MySQL?Oracle / MySQL Reference Manual

Tegishli videolar