+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify ຍ້າຍການຈອງສິນຄ້າຄົງຄັງເຂົ້າໄປໃນ MySQL

Shopify ໄດ້ຍ້າຍລະບົບການຈອງສິນຄ້າຄົງຄັງຂອງຕົນຈາກ Redis ໄປຍັງຖານຂໍ້ມູນ MySQL ທີ່ໄດ້ເກັບຮັກສາບັນຊີລາຍການສິນຄ້າຄົງຄັງໄວ້ແລ້ວ.

Shopify ໄດ້ຍ້າຍລະບົບການຈອງສິນຄ້າຄົງຄັງຂອງຕົນຈາກ Redis ໄປຍັງຖານຂໍ້ມູນ MySQL ທີ່ໄດ້ເກັບຮັກສາບັນຊີລາຍການສິນຄ້າຄົງຄັງໄວ້ແລ້ວ. ກຸ່ມຂໍ້ມູນແຖວຫົວໜ່ວຍທີ່ສາມາດລັອກໄດ້ແບບສ່ວນຕົວທີ່ມີຂອບເຂດຈຳກັດຊ່ວຍໃຫ້ການສັ່ງຊື້ພ້ອມກັນໃຊ້ SKIP LOCKED ເພື່ອເລືອກຫົວໜ່ວຍທີ່ມີສິດທີ່ແຕກຕ່າງກັນ. ການອອກແບບຍັງຂຶ້ນກັບຂອບເຂດທຸລະກຳ, ຮູບແບບຫຼັກ, ກົດລະບບການເຕີມເຕັມ ແລະ ການສັງເກດເວລາການຖືຄອງການເຊື່ອມຕໍ່ໃນການສັ່ງຊື້.

ອ່ານສະບັບລາຍລັກອັກສອນ (ພາສາອັງກິດ) ↗

ສິ່ງທີ່ວິດີໂອນີ້ກວມເອົາ

  • ຮູບແບບເຄື່ອງນັບປະລິມານ Redis ເກົ່າໄດ້ຈັດການການພ້ອມກັນ, ແຕ່ການລ້າງການຈອງ ແລະ ການອັບເດດບັນຊີລາຍການ MySQL ບໍ່ສາມາດແບ່ງປັນທຸລະກຳປະລໍາມະນູທ້ອງຖິ່ນດຽວໄດ້.
  • ການທົດແທນໃຊ້ຫນຶ່ງແຖວຕໍ່ຫນຶ່ງຫົວໜ່ວຍທີ່ມີຢູ່ໃນກຸ່ມທີ່ຈຳກັດຢູ່ທີ່ 1,000 ຕໍ່ການປະສົມປະສານຂອງສິນຄ້າ/ສະຖານທີ່. ກຸ່ມຂໍ້ມູນທີ່ຫວ່າງເປົ່າສາມາດກະຕຸ້ນການເຕີມເຕັມແບບ inline ດ້ວຍຄຳຮ້ອງຂໍທີ່ພ້ອມກັນລໍຖ້າຢູ່ເບື້ອງຫຼັງການລັອກການເຕີມເຕັມ.
  • ລະຫັດຫຼັກປະກອບແມ່ນ (shop_id, inventory_item_id, inventory_group_id, id). Shopify ໄດ້ຫຼຸດຜ່ອນຄ່າໃຊ້ຈ່າຍຂອງການລັອກໃນຕົວແບບຂອງຕົນ ແລະ ໃຊ້ READ COMMITTED ເພື່ອຫຼີກເວັ້ນການລັອກຊ່ອງຫວ່າງທີ່ຂັດຂວາງການເຕີມເຕັມ.
  • ການຈອງລຶບແຖວຂໍ້ມູນກ່ອນທີ່ຈະໃສ່ບັນທຶກການຈອງ. ການຢືນຢັນຈະປ່ອຍການລັອກຖານຂໍ້ມູນໃນຂະນະທີ່ການຖືຄອງທີ່ເກັບໄວ້ຍັງຄົງຢູ່ຕໍ່ການຈ່າຍເງິນ; ການຈ່າຍເງິນທີ່ສໍາເລັດຈະຮຽກຮ້ອງບັນຊີລາຍການແລະລຶບການຈອງໃນທຸລະກໍາປະລໍາມະນູຕໍ່ມາ.
  • ເອກະສານ MySQL SKIP LOCKED ເປັນມຸມມອງທີ່ບໍ່ສອດຄ່ອງກັນທີ່ບໍ່ລວມແຖວທີ່ຖືກລັອກ. ມັນບໍ່ໄດ້ສ້າງຈໍານວນຫຼັກຊັບທີ່ສົມບູນຫຼືການປ່ຽນແປງທີ່ຍຸດຕິທໍາ, ໃຊ້ໄດ້ກັບການລັອກລະດັບແຖວເທົ່ານັ້ນແລະບໍ່ປອດໄພສໍາລັບການຈຳລອງແບບອີງຕາມຄໍາສັ່ງ.
  • ຕົວຢ່າງແຫຼ່ງຂໍ້ມູນລວມມີ expires_at, ແຕ່ Shopify ບໍ່ໄດ້ບັນທຶກສູດການຄິດໄລ່ການລ້າງຂໍ້ກຳນົດຂອງ MySQL. ສາຂາການປ່ອຍ/ໝົດອາຍຸຂອງວິດີໂອແມ່ນຂໍ້ກຳນົດວົງຈອນຊີວິດທີ່ອະທິບາຍ.
  • ເວລາການຖືຄອງການເຊື່ອມຕໍ່ໃນລະຫັດການສັ່ງຊື້ອື່ນໆແມ່ນຂໍ້ຈໍາກັດສຸດທ້າຍຂອງປະສິດທິພາບ. Shopify ໄດ້ຂຽນເງົາທັງສອງລະບົບ, ປຽບທຽບຜົນໄດ້ຮັບ ແລະ ປ່ຽນແປງເທື່ອລະກ້າວດ້ວຍການສັບປ່ຽນປິດ Redis.

ບົດບັນທຶກທີ່ແປແລ້ວ

ແປຈາກຄຳບັນຍາຍຕົ້ນສະບັບພາສາອັງກິດ. ສຽງ ແລະ ຄຳບັນຍາຍທີ່ມີໃຫ້ແມ່ນຄວບຄຸມໂດຍ YouTube.

ເປັນຫຍັງຕ້ອງຍ້າຍການຈອງເຂົ້າໄປໃນ MySQL?

0:00 ການສັ່ງຊື້ຕ້ອງການ Redis ເພື່ອໃຫ້ໄວ. Shopify ຍ້າຍການຈອງສິນຄ້າຄົງຄັງເຂົ້າໄປໃນ MySQL ໂດຍໃຊ້ແຖວດຽວຕໍ່ຫົວໜ່ວຍໃນ ກຸ່ມຂໍ້ມູນທີ່ມີຂອບເຂດຈຳກັດ. ເປັນຫຍັງຈຶ່ງເລືອກ MySQL? ທ່ານຈະຂ້າມການລັອກຢ່າງປອດໄພໄດ້ແນວໃດ? ນີ້ແມ່ນ The Daily Diff, ຢູ່ເບື້ອງຫຼັງ. ແລະເປັນຫຍັງການສອບຖາມໄວຈຶ່ງຍັງຕິດເພດານ? Shopify ແມ່ນແພລດຟອມການຄ້າສໍາລັບການຂາຍອອນລາຍແລະດ້ວຍຕົວເອງ. Redis ແມ່ນບ່ອນເກັບຂໍ້ມູນໃນໜ່ວຍຄວາມຈຳ.

0:21 MySQL ແມ່ນຖານຂໍ້ມູນເຊື່ອມໂຍງ, ແລະ Shopify ໄດ້ເກັບຮັກສາບັນຊີລາຍການສິນຄ້າຄົງຄັງຂອງຕົນ ຢູ່ທີ່ນັ້ນ. ການຈອງຈະຖືກເກັບໄວ້ໃນສາງໄລຍະສັ້ນໆໃນຂະນະທີ່ຜູ້ຊື້ຈ່າຍເງິນ.

ເປັນຫຍັງສອງຮ້ານຈຶ່ງສ່ຽງ?

0:29 ຮູບແບບ Redis ຂອງພວກເຂົາໄດ້ຫຼຸດເຄື່ອງນັບລາຍການລົງ. ການຮຽກຮ້ອງຄໍາສັ່ງທີ່ຈ່າຍແລ້ວໝາຍເຖິງການອັບເດດບັນຊີລາຍການ MySQL ແລະການລຶບລ້າງ Redis. ການຂຽນແຍກກັນເຫຼົ່ານັ້ນສາມາດເຮັດໃຫ້ສິນຄ້າຂາຍໄດ້ສອງຄັ້ງ ຫຼືບໍ່ມີໃຫ້ບໍລິການເມື່ອຄວນຈະ ສາມາດຂາຍໄດ້. ຮູບແບບເກົ່າກໍ່ຂາດການຮັບຮູ້ສະຖານທີ່. ການທົດແທນຕ້ອງເລືອກຫຼັກຊັບຈາກບ່ອນໃດບ່ອນໜຶ່ງທີ່ສາມາດຕອບສະຫນອງຄໍາສັ່ງໄດ້. ສາງຢູ່ທະວີບທີ່ຜິດພາດເຮັດໃຫ້ການປ້ອນຂໍ້ມູນຖານຂໍ້ມູນທີ່ດີເລີດ ແລະເປັນ ຄຳໝັ້ນສັນຍາການຈັດສົ່ງທີ່ຮ້າຍແຮງ. ຄວາມພະຍາຍາມ MySQL ກ່ອນໜ້ານີ້ໄດ້ໃຊ້ແຖວປະລິມານ, ດັ່ງນັ້ນການສັ່ງຊື້ທີ່ແຂ່ງຂັນກັນຈຶ່ງຖືກຈັດລຽງຢູ່ທີ່

ຫົວໜ່ວຍທີ່ສາມາດລັອກໄດ້ຈະກາຍເປັນຫຍັງ?

0:56 ການລັອກດຽວກັນ. ຄິດເຖິງເຊືອກກຳມະຫຍີ່ອ້ອມຮອບຫ້ອງສະເປຣດຊີດ. ການເພີ່ມຄົນງານຫຼາຍຂຶ້ນພຽງແຕ່ເຮັດໃຫ້ແຖວຍາວຂຶ້ນ. Shopify ໄດ້ປ່ຽນວັດຖຸທີ່ສາມາດລັອກໄດ້. ແຕ່ລະຫົວໜ່ວຍທີ່ມີຢູ່ຈະໄດ້ຮັບແຖວຂອງຕົນເອງ. ການອ່ານແບບລັອກຂ້າມຫົວໜ່ວຍອື່ນທີ່ ທຸລະກຳຖືຢູ່ ແລະເລືອກຫົວໜ່ວຍອື່ນໆ ທີ່ມີສິດ. ພະນັກງານທີ່ແຕກຕ່າງກັນສາມາດໄດ້ຮັບແຖວທີ່ແຕກຕ່າງກັນ, ໃນຂະນະທີ່ເຄື່ອງນັບທີ່ຮ້ອນບໍ່ເຂົ້າມາຂັດຂວາງ.

ຈະເກີດຫຍັງຂຶ້ນເມື່ອກຸ່ມຂໍ້ມູນຫວ່າງເປົ່າ?

1:15 ກຸ່ມຂໍ້ມູນນັ້ນຖືກຈຳກັດຢູ່ທີ່ໜຶ່ງພັນແຖວຕໍ່ລາຍການ ແລະສະຖານທີ່. ການເຕີມເຕັມດຶງມາຈາກບັນຊີລາຍການ. ຖ້າມັນຫວ່າງເປົ່າ, ເສັ້ນທາງ ການຈອງຈະເຕີມເຕັມແບບ inline, ດ້ວຍຄຳຮ້ອງຂໍທີ່ແຂ່ງຂັນກັນ ລໍຖ້າຢູ່ເບື້ອງຫຼັງການລັອກການເຕີມເຕັມ. ກຸ່ມຂໍ້ມູນທີ່ຫວ່າງເປົ່າບໍ່ໄດ້ໝາຍເຖິງສາງທີ່ຫວ່າງເປົ່າ. ການຈອງລຶບແຖວຂໍ້ມູນທີ່ເລືອກ, ຈາກນັ້ນໃສ່ບັນທຶກການຈອງໃນ ທຸລະກໍາ. ການຢືນຢັນຈະປ່ອຍການລັອກຖານຂໍ້ມູນ.

1:35 ການຍົກເລີກການປ່ຽນແປງ. ການຈອງຍັງຄົງຢູ່ຕໍ່ການປະມວນຜົນການຈ່າຍເງິນເປັນສະຖານະທີ່ເກັບໄວ້. ການຈ່າຍເງິນທີ່ສໍາເລັດຈະຮຽກຮ້ອງບັນຊີລາຍການແລະລຶບການຈອງແບບປະລໍາມະນູ. ການລັອກຖານຂໍ້ມູນບໍ່ຈໍາເປັນຕ້ອງເຝົ້າແບບຟອມການຈ່າຍເງິນ. ລະຫັດຫຼັກປະກອບຂອງພວກເຂົາເລີ່ມຕົ້ນດ້ວຍຮ້ານຄ້າ, ສິນຄ້າ, ກຸ່ມ, ຫຼັງຈາກນັ້ນລະຫັດຫົວໜ່ວຍ. ການຈັບຄູ່ການຄົ້ນຫາຫຼຸດຜ່ອນການລັອກດັດສະນີໃນຕົວແບບຂອງພວກເຂົາ. ພວກເຂົາຍັງໃຊ້ການອ່ານທີ່ຖືກຢືນຢັນເພື່ອຫຼີກເວັ້ນການລັອກຊ່ອງຫວ່າງທີ່ຂັດຂວາງການເຕີມເຕັມກຸ່ມຂໍ້ມູນ,

1:57 ແລະຄໍາສັ່ງຕາຕະລາງທີ່ສອດຄ່ອງກັນເພື່ອປ້ອງກັນການລໍຖ້າແບບວົງຈອນ. ຕົວຢ່າງທີ່ເຜີຍແຜ່ບັນທຶກເວລາໝົດອາຍຸ. ການຈ່າຍເງິນທີ່ຖືກປະຖິ້ມຕ້ອງການການປ່ອຍສິນຄ້າຄົງຄັງໃນທີ່ສຸດ, ຖ້າບໍ່ດັ່ງນັ້ນກະຕ່າສິນຄ້າຈະກາຍເປັນ ເຈົ້າຂອງເຮືອນ. ຂໍ້ຄວາມຂອງ Shopify ປະຖິ້ມສູດການຄິດໄລ່ການລຶບລ້າງນັ້ນບໍ່ໄດ້ລະບຸ, ດັ່ງນັ້ນແຜນວາດນີ້ສະແດງໃຫ້ເຫັນຂໍ້ກຳນົດວົງຈອນຊີວິດ. ນີ້ແມ່ນບັນຫາ.

SKIP LOCKED ປະໄວ້ຫຍັງແດ່?

2:14 Skip locked ຍົກເວັ້ນແຖວທີ່ຖືກລັອກ, ດັ່ງນັ້ນຄູ່ມືຈຶ່ງເອີ້ນຜົນໄດ້ຮັບຂອງມັນວ່າເປັນມຸມມອງທີ່ບໍ່ສອດຄ່ອງກັນ. ມັນບໍ່ໄດ້ໃຫ້ຈໍານວນຫຼັກຊັບທີ່ສົມບູນຫຼືການປ່ຽນແປງທີ່ຍຸດຕິທໍາ. ຮັກສາການຕັດສິນໃຈທີ່ມີຢູ່ແລະກົດລະບຽບການເຕີມເຕັມຢູ່ອ້ອມຮອບມັນ.

ເພດານທີ່ແທ້ຈິງຢູ່ໃສ?

2:26 ແລະເພດານນັ້ນ? ລະຫັດການສັ່ງຊື້ອື່ນໆກໍາລັງຖືການເຊື່ອມຕໍ່ຖານຂໍ້ມູນດົນເກີນໄປ. Shopify ໄດ້ຕິດປ້າຍຜູ້ໂທ ແລະວັດແທກເວລາການຖືຄອງການເຊື່ອມຕໍ່, ຈາກນັ້ນໄດ້ລ້າງເສັ້ນທາງການສັ່ງຊື້ ແລະທົບທວນຄືນການພ້ອມກັນຂອງ thread. ການສອບຖາມໄວສາມາດຍັງຖືກຈັດລຽງຢູ່ນອກການສອບຖາມໄດ້.

ເປັນຫຍັງຂ້ອຍຈຶ່ງຈະສົ່ງການອອກແບບນີ້?

2:38 ພວກເຂົາໄດ້ຂຽນເງົາທັງສອງລະບົບດ້ວຍ Redis ທີ່ເປັນທາງການ, ປຽບທຽບຜົນໄດ້ຮັບ, ຈາກນັ້ນປ່ຽນແປງເທື່ອລະກ້າວດ້ວຍປຸ່ມປິດ. ຄໍາຕັດສິນຂອງຂ້ອຍຄື SHIP IT. ຂ້ອຍຈະຈັດສົ່ງຂອບເຂດທຸລະກໍາທີ່ແບ່ງປັນແລະການນໍາໃຊ້ທີ່ສາມາດຍົກເລີກໄດ້ນັ້ນ, ໂດຍມີເສັ້ນທາງການສັ່ງຊື້ທັງໝົດຖືກກວດສອບ. ມີຄໍາຖາມກ່ຽວກັບເລື່ອງນີ້ບໍ? ໃສ່ໄວ້ໃນຄໍາເຫັນ. ແລະນັ້ນຄື diff ສໍາລັບມື້ນີ້.

2:54 ຂ້ອຍຄື Niko ຈາກ Axrisi. ລວມເຂົ້າກັນຢ່າງມີຄວາມຮັບຜິດຊອບ.

ແຫຼ່ງຂໍ້ມູນ

  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

ວິດີໂອທີ່ກ່ຽວຂ້ອງ

under-the-hood · lo · 11 ຕ.ລ. 2026

Stripe ຈື່ຄໍາຮ້ອງຂໍຂອງທ່ານເມື່ອຄໍາຕອບຫາຍໄປ

ການໝົດເວລາມີຜົນໃຫ້ການຈ່າຍເງິນບໍ່ແນ່ນອນຫຼັງຈາກເຊີບເວີໄດ້ສໍາເລັດການດໍາເນີນງານ. ຕົວອະທິບາຍພາຍໃຕ້ຜ້າຄຸມນີ້ໃຊ້ສັນຍາຄວາມຄົງຕົວທີ່ໄດ້ລະບຸໄວ້ໃນ Stripe API v1 ເພື່ອສະແດງກະແຈການດໍາເນີນງານທີ່ໝັ້ນຄົງ, ການຫຼິ້ນຄືນ

2:54 ↗
under-the-hood · lo · 24 ກ.ຍ. 2026

SAML, ພາຍໃຕ້ຜ້າຄຸມ: ລາຍເຊັນພາຍໃນຈົດໝາຍ

SAML ລົງຊື່ເຂົ້າໃຊ້ທ່ານເຂົ້າໃນເກືອບທຸກແອັບເຮັດວຽກ, ແລະລາຍເຊັນຂອງມັນອາໄສຢູ່ພາຍໃນ XML ທີ່ມັນເຊັນ. ພາຍໃຕ້ຜ້າຄຸມ: ການເຕັ້ນລຳການເຂົ້າສູ່ລະບົບລະຫວ່າງແອັບ, ບຣາວເຊີ ແລະຜູ້ໃຫ້ບໍລິການຕົວຕົນ, ການຢືນຢັນເປັນແນວໃດ,

3:02 ↗
under-the-hood · lo · 23 ກ.ຍ. 2026

ເວລາທີ່ຕົວແບບຕາຍ, ພາຍໃຕ້ຜ້າຄຸມ

ຕົວແບບ AI ບໍ່ໄດ້ຕາຍ — ມັນໄດ້ຮັບວັນທີປິດ, ແລະໃນຕອນເຊົ້າຂອງມື້ຕໍ່ມາ, ການໂທ API ຂອງທ່ານຈະສົ່ງຄືນ 404: "ຕົວແບບນີ້ຖືກຍົກເລີກແລ້ວ, ຮຽນຮູ້ເພີ່ມເຕີມທີ່ນີ້." ພາຍໃຕ້ຜ້າຄຸມ: ທໍ່ສົ່ງສີ່ສະຖານະ (ເຄື່ອນໄຫວ → ເກົ່າ →

3:15 ↗
under-the-hood · lo · 21 ກ.ຍ. 2026

Claude ໄດ້ຖອດລະຫັດ RSA-896. ນີ້ຄືວິທີທີ່ RSA ແຕກຕົວຈິງ

ໃນວັນທີ 19 ກັນຍາ, ວິສະວະກອນຂອງ Anthropic ໄດ້ຖອດລະຫັດ RSA-896 — ເຊິ່ງເປັນຕົວເລກທ້າທາຍ 270 ຕົວເລກ — ດ້ວຍ Claude, ເປັນ GPU port ຂອງ CADO-NFS sieve ແບບ open-source ແລະ ໃຊ້ເວລາ ~30 GPU-ປີ ໃນ 2,048 GPUs ທີ່

3:39 ↗