+− THE DAILY DIFFdev & AI news
SHIP IT

Shopify przeniósł rezerwacje zapasów do MySQL

Shopify przeniósł swój system rezerwacji zapasów z Redis do bazy danych MySQL, która już przechowywała księgę zapasów.

Shopify przeniósł swój system rezerwacji zapasów z Redis do bazy danych MySQL, która już przechowywała księgę zapasów. Ograniczona pula indywidualnie blokowalnych wierszy jednostek pozwala równoczesnym transakcjom zakupu używać SKIP LOCKED do wybierania różnych dostępnych jednostek. Projekt zależy również od granic transakcji, układu klucza podstawowego, zasad uzupełniania i obserwowania czasu utrzymania połączenia podczas transakcji zakupu.

Przeczytaj wydanie pisemne (angielski) ↗

Co obejmuje ten film

  • Stary model licznika ilości w Redis obsługiwał współbieżność, ale czyszczenie rezerwacji i aktualizacja księgi MySQL nie mogły współdzielić jednej lokalnej transakcji atomowej.
  • Nowe rozwiązanie wykorzystuje jeden wiersz na każdą dostępną jednostkę w puli ograniczonej do 1000 na kombinację przedmiotu/lokalizacji. Pusta pula może wywołać uzupełnienie w linii, a równoczesne żądania czekają za blokadą uzupełnienia.
  • Złożony klucz podstawowy to (shop_id, inventory_item_id, inventory_group_id, id). Shopify zmniejszyło narzut blokad w swoim prototypie i użyło READ COMMITTED, aby uniknąć blokad szczelinowych, które blokowały uzupełnianie.
  • Rezerwacja usuwa wiersze z puli przed wstawieniem rekordów rezerwacji. Zatwierdzenie zwalnia blokady bazy danych, podczas gdy przechowywane wstrzymanie trwa przez płatność; udana płatność rości sobie prawo do księgi i usuwa rezerwację w późniejszej transakcji atomowej.
  • MySQL dokumentuje SKIP LOCKED jako niespójny widok, który pomija zablokowane wiersze. Nie ustala pełnej liczby zapasów ani sprawiedliwego kolejkowania, dotyczy tylko blokad na poziomie wiersza i jest niebezpieczne dla replikacji opartej na instrukcjach.
  • Przykładowe źródło zawiera expires_at, ale Shopify nie dokumentuje algorytmu czyszczenia wygasłych rezerwacji w MySQL. Gałąź zwolnienia/wygaśnięcia wideo jest wyjaśnieniem wymagań cyklu życia.
  • Czas utrzymania połączenia w innym kodzie transakcji zakupu był ostatecznym wąskim gardłem przepustowości. Shopify w tle pisało do obu systemów, porównywało wyniki i stopniowo przełączało się z awaryjnym przełącznikiem Redis.

Przetłumaczona transkrypcja

Przetłumaczono z oryginalnej narracji angielskiej. Dostępne audio i napisy są kontrolowane przez YouTube.

Dlaczego przenieść rezerwacje do MySQL?

0:00 Transakcja zakupu potrzebuje Redis, aby pozostać szybka. Shopify przeniósł rezerwacje zapasów do MySQL, używając jednego wiersza na jednostkę w ograniczonej puli. Dlaczego wybrano MySQL? Jak bezpiecznie pominąć blokady? To jest The Daily Diff, pod maską. I dlaczego szybkie zapytania nadal napotykały sufit? Shopify to platforma handlowa do sprzedaży online i osobiście. Redis to magazyn danych w pamięci.

0:21 MySQL to relacyjna baza danych, a Shopify już przechowywał w niej swoją księgę zapasów. Rezerwacja krótko wstrzymuje towar, podczas gdy kupujący płaci.

Dlaczego dwa magazyny były ryzykowne?

0:29 Ich model Redis dekrementował licznik przedmiotów. Potwierdzenie opłaconego zamówienia oznaczało aktualizację księgi MySQL i czyszczenie Redis. Te oddzielne zapisy mogły sprawić, że towar został sprzedany dwukrotnie lub był niedostępny, gdy powinien być dostępny do sprzedaży. Stary model również nie uwzględniał lokalizacji. Nowe rozwiązanie musi wybierać towar z miejsca, które może zrealizować zamówienie. Magazyn na złym kontynencie to doskonały wpis do bazy danych i okropna obietnica dostawy. Wcześniejsze próby z MySQL używały wiersza ilościowego, więc konkurujące transakcje zakupu czekały w kolejce przy

Co staje się jednostką do zablokowania?

0:56 tej samej blokadzie. Pomyśl o aksamitnej lince wokół komórki arkusza kalkulacyjnego. Dodanie większej liczby pracowników tylko wydłuża kolejkę. Shopify zmieniło obiekt do zablokowania. Każda dostępna jednostka otrzymuje swój własny wiersz. Odczyt blokujący pomija jednostki, które inna transakcja trzyma, i wybiera inne dostępne jednostki. Różni pracownicy mogą nabywać różne wiersze, podczas gdy licznik gorących przedmiotów pozostaje poza ich zasięgiem.

Co się dzieje, gdy pula się wyczerpuje?

1:15 Ta pula jest ograniczona do tysiąca wierszy na przedmiot i lokalizację. Uzupełnianie czerpie z księgi. Jeśli się wyczerpie, ścieżka rezerwacji uzupełnia w linii, z konkurującymi żądaniami czekającymi za blokadą uzupełnienia. Pusta pula nie oznacza pustego magazynu. Rezerwacja usuwa wybrane wiersze z puli, a następnie wstawia rekordy rezerwacji w transakcji. Zatwierdzenie zwalnia blokady bazy danych.

1:35 Wycofanie cofa zmiany. Rezerwacja przetrwa przetwarzanie płatności jako przechowywany stan. Udane płatności roszczą sobie prawo do księgi i usuwają rezerwację atomowo. Blokady bazy danych nigdy nie muszą pilnować formularza płatności. Ich złożony klucz podstawowy zaczyna się od sklepu, przedmiotu, grupy, a następnie identyfikatora jednostki. Dopasowanie wyszukiwania zmniejszyło blokowanie indeksów w ich prototypie. Używają również read committed, aby uniknąć blokad szczelinowych, które blokowały uzupełnianie puli,

1:57 oraz spójnego porządku tabel, aby zapobiec okrężnym oczekiwaniom. Opublikowany przykład rejestruje czas wygaśnięcia. Porzucone płatności muszą ostatecznie zwolnić towar, inaczej koszyk zakupów staje się właścicielem. Post Shopify pozostawia ten algorytm czyszczenia niesprecyzowany, więc ten diagram przedstawia wymaganie cyklu życia. Oto haczyk.

Czego brakuje w SKIP LOCKED?

2:14 Skip locked wyklucza zablokowane wiersze, więc instrukcja nazywa swój wynik niespójnym widokiem. Nie zapewnia ani pełnej liczby zapasów, ani sprawiedliwego kolejkowania. Zachowaj decyzję o dostępności i zasady uzupełniania wokół niej.

Gdzie był prawdziwy sufit?

2:26 A ten sufit? Inny kod transakcji zakupu zbyt długo utrzymywał połączenia z bazą danych. Shopify oznaczyło wywołujących i zmierzyło czas utrzymania połączenia, następnie posprzątało ścieżkę transakcji zakupu i ponownie rozważyło współbieżność wątków. Szybkie zapytania mogą nadal stać w kolejce poza zapytaniem.

Dlaczego miałbym wdrożyć ten projekt?

2:38 W tle zapisywali do obu systemów z Redis jako autorytatywnym, porównali wyniki, a następnie stopniowo przełączyli się z przełącznikiem awaryjnym. Mój werdykt to SHIP IT. Wysłałbym wspólną granicę transakcji i ten wycofywalny wdrożenie, z całą ścieżką transakcji zakupu instrumentowaną. Masz pytanie na ten temat? Zostaw je w komentarzach. I to jest diff na dziś.

2:54 Jestem Niko z Axrisi. Łącz odpowiedzialnie.

Źródła

  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

Powiązane filmy