Jeśli wyobrażasz sobie firmę taką jak Amazon (lub jakakolwiek inna duża aplikacja internetowa), która prowadzi sklep internetowy na masową skalę i ma tylko ograniczoną liczbę przedmiotów fizycznych w swoich magazynach, w jaki sposób mogą to zoptymalizować, aby nie było pojedyncze wąskie gardło? Oczywiście muszą mieć wiele baz danych z replikacją i wiele serwerów, które niezależnie obsługują obciążenie. Jeśli jednak wielu serwerów jest obsługiwanych przez oddzielne serwery i obaj próbują dodać ten sam produkt do koszyka, dla którego został tylko jeden, musi istnieć pewne „źródło prawdy” dla ilości pozostałej dla tego produktu. Czy nie oznacza to, że przynajmniej wszyscy użytkownicy uzyskujący dostęp do informacji o produkcie dla jednego elementu muszą wysyłać zapytania do tej samej bazy danych szeregowo?
Chciałbym zrozumieć, w jaki sposób możesz prowadzić tak duży sklep za pomocą przetwarzania rozproszonego, a nie tworzyć ogromnego wąskiego gardła na jednym DB zawierającym informacje o zapasach.
źródło
Odpowiedzi:
Nie całkiem. Nie jest to problem wymagający w 100% doskonałego rozwiązania technicznego, ponieważ oba przypadki błędów mają rozwiązanie biznesowe, które nie jest bardzo drogie:
W rzeczywistości sam ostatnio doświadczyłem drugiego przypadku, więc nie jest to hipotetyczne: tak się dzieje i jak sobie z tym radzi Amazon.
Jest to koncepcja, która ma zastosowanie często, gdy masz problem, który teoretycznie jest bardzo trudny do rozwiązania (czy to pod względem wydajności, optymalizacji, czy cokolwiek innego): często możesz żyć z rozwiązaniem, które działa naprawdę dobrze w większości przypadków i zaakceptować, że czasami zawodzi, o ile można wykryć i obsłużyć awarie, gdy wystąpią.
źródło
Kombinacją
Nie ma magii, tylko coraz bardziej złożone sytuacje. Podobnie jak DNS, jest on skalowany.
„Jedna wersja prawdy” jest częścią takich systemów. Generowanie nowego klucza staje się bardziej złożoną operacją niż generowanie kolejnej liczby w sekwencji. Na przykład istnieją inne sekwencje. Jest to rodzaj złożoności, z którym mogą sobie poradzić rozproszone systemy baz danych. Robią to, wykonując kilka operacji do i ze składników podczas tworzenia nowych obiektów, udostępniając je innym, upewniając się, że sekwencje są unikalne, gdy są potrzebne, klucze złożone itp. .
źródło
Widziałem problem „Ostatnia pozycja w magazynie” rozwiązany w następujący sposób:
Codziennie aktualizuj wszystkie poziomy zapasów i oznacz produkty jako wysokie, niskie, na zamówienie lub poza kategoriami zapasów zgodnie z poziomami progowymi.
Oczywiście problematyczne są „niskie zapasy”
Nie zawracaj sobie głowy sprawdzaniem poziomu zapasów. Po prostu złóż zamówienie
Ostrzeż użytkownika podczas przeglądania „Ostatnich zostało!”. kiedy idą zapłacić, sprawdź i zmniejsz stan zapasów. Jeśli jest niedostępny, zaktualizuj status produktu.
W ten sposób trafiasz tylko do bazy danych produktów „z niskim stanem” i robisz to tylko wtedy, gdy klient jest na bardzo niskim poziomie procesu zakupu. Koszt jest taki, że niektórzy klienci nie będą mogli sfinalizować zakupu.
Jednak w większości przypadków „brak w magazynie” oznacza po prostu, że czekasz na kolejną dostawę, więc i tak chcesz zaakceptować zamówienie, a może po prostu wyświetlić ostrzeżenie lub ograniczyć opcje dostawy. Więc ci klienci nie są straceni.
W okresach dużego obciążenia, takich jak sprzedaż, możesz nawet wyłączyć sprawdzanie zapasów i po prostu wysłać do klientów e-mailem później „przepraszam, że skończyło nam się X, czy chciałbyś Y”
Zasadniczo cel dowolnej platformy e-commerce nigdy nie jest odczytywany z bazy danych. Zawsze wyświetlaj strony z pamięci podręcznej i rób wszystko po stronie klienta.
źródło
W tym filmie Martin Fowler omawia bazy danych NoSQL:
https://www.youtube.com/watch?v=qI_g07C_Q5I
Jedną z rzeczy (gdzieś tam) jest to, że miejsca takie jak Amazon wolą zadowolić 99% ludzi, przyjmując ich zamówienie bez możliwości sprawdzenia „na pewno”, czy jest ono faktycznie dostępne, a może irytują bardzo mały odsetek, mając mówiąc „przepraszam, wygląda na to, że ktoś cię pobił”.
Oznacza to, że nie ma prawdziwej obsługi opisywanego scenariusza, tylko że Amazon korzysta z wątpliwości opartych na ostatnim udanym odczytaniu spisu i jeśli równoległa transakcja wpadła pomiędzy - oopsie.
(przy okazji, to świetny film, jeśli jesteś ciekaw NoSQL)
źródło