+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify memindahkan reservasi inventaris ke MySQL

Shopify memindahkan sistem reservasi inventarisnya dari Redis ke database MySQL yang sudah menyimpan buku besar inventaris.

Shopify memindahkan sistem reservasi inventarisnya dari Redis ke database MySQL yang sudah menyimpan buku besar inventaris. Kumpulan baris unit yang dapat dikunci secara individual memungkinkan checkout bersamaan menggunakan SKIP LOCKED untuk memilih unit yang berbeda dan memenuhi syarat. Desain ini juga bergantung pada batasan transaksi, tata letak kunci utama, aturan pengisian ulang, dan pengamatan waktu tunggu koneksi selama checkout.

Baca edisi tertulis (Inggris) ↗

Isi video ini

  • Model penghitung kuantitas Redis yang lama menangani konkurensi, tetapi pembersihan reservasi dan pembaruan buku besar MySQL tidak dapat berbagi satu transaksi atomik lokal.
  • Penggantinya menggunakan satu baris per unit yang tersedia dalam kumpulan yang dibatasi hingga 1.000 per kombinasi item/lokasi. Kumpulan kosong dapat memicu pengisian ulang sebaris dengan permintaan bersamaan yang menunggu di belakang kunci pengisian ulang.
  • Kunci utama komposit adalah (shop_id, inventory_item_id, inventory_group_id, id). Shopify mengurangi overhead kunci dalam prototipe-nya dan menggunakan READ COMMITTED untuk menghindari kunci celah yang memblokir pengisian ulang.
  • Pesan menghapus baris kumpulan sebelum menyisipkan catatan reservasi. Komit melepaskan kunci database sementara penahanan yang disimpan tetap ada setelah pembayaran; pembayaran yang berhasil mengklaim buku besar dan menghapus reservasi dalam transaksi atomik selanjutnya.
  • Dokumen MySQL SKIP LOCKED sebagai tampilan tidak konsisten yang menghilangkan baris terkunci. Ini tidak menetapkan jumlah stok lengkap atau pengambilan giliran yang adil, hanya berlaku untuk kunci tingkat baris dan tidak aman untuk replikasi berbasis pernyataan.
  • Contoh sumber mencakup expires_at, tetapi Shopify tidak mendokumentasikan algoritma pembersihan kedaluwarsa MySQL. Cabang rilis/kedaluwarsa video adalah persyaratan siklus hidup penjelasan.
  • Waktu penahanan koneksi dalam kode checkout lainnya adalah hambatan throughput terakhir. Shopify secara bayangan menulis kedua sistem, membandingkan hasilnya dan beralih secara bertahap dengan fallback sakelar pemutus Redis.

Transkrip terjemahan

Diterjemahkan dari narasi asli bahasa Inggris. Audio dan teks tersedia yang dikontrol oleh YouTube.

Mengapa memindahkan reservasi ke MySQL?

0:00 Checkout membutuhkan Redis agar tetap cepat. Shopify memindahkan reservasi inventaris ke MySQL menggunakan satu baris per unit dalam kumpulan terbatas. Mengapa memilih MySQL? Bagaimana Anda melewati kunci dengan aman? Ini adalah The Daily Diff, di balik kap mesin. Dan mengapa kueri cepat masih mencapai batasnya? Shopify adalah platform perdagangan untuk menjual secara online dan secara langsung. Redis adalah penyimpanan data dalam memori.

0:21 MySQL adalah database relasional, dan Shopify sudah menyimpan buku besar inventarisnya di sana. Sebuah reservasi secara singkat menahan stok saat pembeli membayar.

Mengapa dua toko berisiko?

0:29 Model Redis mereka mengurangi penghitung item. Mengklaim pesanan yang dibayar berarti memperbarui buku besar MySQL dan membersihkan Redis. Penulisan terpisah tersebut dapat menyebabkan stok terjual dua kali atau tidak tersedia saat seharusnya dapat dijual. Model lama juga tidak memiliki kesadaran lokasi. Penggantinya harus memilih stok dari suatu tempat yang dapat memenuhi pesanan. Gudang di benua yang salah membuat entri database yang sangat baik dan janji pengiriman yang buruk. Upaya MySQL sebelumnya menggunakan baris kuantitas, sehingga checkout yang bersaing mengantre pada

Apa yang menjadi unit yang dapat dikunci?

0:56 kunci yang sama. Bayangkan tali beludru di sekitar sel spreadsheet. Menambah lebih banyak pekerja hanya memperpanjang antrean. Shopify mengubah objek yang dapat dikunci. Setiap unit yang tersedia mendapatkan barisnya sendiri. Pembacaan penguncian melewati unit yang lain transaksi menahan dan memilih unit lain yang memenuhi syarat. Pekerja yang berbeda dapat memperoleh baris yang berbeda, sementara penghitung panas tidak menghalangi mereka.

Apa yang terjadi ketika kumpulan kosong?

1:15 Kumpulan itu dibatasi pada seribu baris per item dan lokasi. Pengisian ulang mengambil dari buku besar. Jika kosong, jalur cadangan mengisi ulang sebaris, dengan permintaan yang bersaing menunggu di belakang kunci pengisian ulang. Kumpulan kosong tidak berarti gudang kosong. Pesan menghapus baris kumpulan yang dipilih, lalu menyisipkan catatan reservasi dalam sebuah transaksi. Komit melepaskan kunci database.

1:35 Rollback membatalkan perubahan. Reservasi bertahan dari pemrosesan pembayaran sebagai status yang disimpan. Pembayaran yang berhasil mengklaim buku besar dan menghapus reservasi secara atomik. Kunci database tidak perlu mengawasi formulir pembayaran. Kunci utama komposit mereka dimulai dengan toko, item, grup, lalu identitas unit. Pencocokan pencarian mengurangi penguncian indeks dalam prototipe mereka. Mereka juga menggunakan read committed untuk menghindari kunci celah yang memblokir pengisian ulang

1:57 kumpulan, dan urutan tabel yang konsisten untuk mencegah penantian melingkar. Contoh yang dipublikasikan mencatat waktu kedaluwarsa. Pembayaran yang ditinggalkan membutuhkan stok yang dilepaskan akhirnya, atau keranjang belanja menjadi pemilik. Posting Shopify membiarkan algoritma pembersihan itu tidak ditentukan, jadi diagram ini menunjukkan persyaratan siklus hidup. Inilah masalahnya.

Apa yang tidak dicakup oleh SKIP LOCKED?

2:14 Skip locked mengecualikan baris yang terkunci, jadi manual menyebut hasilnya sebagai tampilan yang tidak konsisten. Ini tidak memberikan jumlah stok lengkap maupun pengambilan giliran yang adil. Pertahankan keputusan ketersediaan dan aturan pengisian ulang di sekitarnya.

Di mana batas sebenarnya?

2:26 Dan batas itu? Kode checkout lain menahan koneksi database terlalu lama. Shopify menandai pemanggil dan mengukur waktu penahanan koneksi, lalu membersihkan jalur checkout dan meninjau konkurensi utas. Kueri cepat masih bisa mengantre di luar kueri.

Mengapa saya harus mengirimkan desain ini?

2:38 Mereka secara bayangan menulis kedua sistem dengan Redis yang berwenang, membandingkan hasilnya, lalu beralih secara bertahap dengan sakelar pemutus. Keputusan saya adalah SHIP IT. Saya akan mengirimkan batasan transaksi bersama dan peluncuran yang dapat digulirkan kembali itu, dengan seluruh jalur checkout diinstrumentasi. Ada pertanyaan tentang ini? Tulis di kolom komentar. Dan itulah perbedaan untuk hari ini.

2:54 Saya Niko dari Axrisi. Gabungkan dengan bertanggung jawab.

Sumber

  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

Video terkait