Wie vermeidet ein Unternehmen wie Amazon Engpässe beim Zugriff auf die Datenbankebene?

29

Wenn Sie sich ein Unternehmen wie Amazon (oder eine andere große E-Commerce-Webanwendung) vorstellen, das einen Online-Shop in großem Umfang betreibt und nur eine begrenzte Menge physischer Artikel in seinen Lagern hat, wie können sie dies optimieren, sodass es keine gibt? Single Bottleneck? Natürlich müssen sie eine Reihe von Datenbanken mit Replikation und viele Server haben, die die Last unabhängig handhaben. Wenn jedoch mehrere Benutzer von unterschiedlichen Servern bedient werden und beide versuchen, denselben Artikel in ihren Warenkorb zu legen, für den nur noch einer übrig ist, muss es eine "Wahrheitsquelle" für die für diesen Artikel verbleibende Menge geben. Würde dies nicht bedeuten, dass mindestens alle Benutzer, die auf Produktinformationen für einen einzelnen Artikel zugreifen, dieselbe Datenbank seriell abfragen müssen?

Ich würde gerne verstehen, wie Sie mit Distributed Computing ein so großes Geschäft betreiben und keinen großen Engpass in einer einzelnen Datenbank mit Inventarinformationen verursachen können.

mattgmg1990
quelle
Amazon Architektur in der Mitte der 2000er Jahre (immer noch relevant für Ihre Frage): highscalability.com/amazon-architecture
Joeri Sebrechts
Dies gilt auch für Sitzplätze in Flugzeugen (oder z. B. für Pauschalreisen, bei denen ein Artikel im Einkaufswagen einen Flug dorthin, einen Mietwagen, einen Hotelaufenthalt und einen Rückflug darstellt), wobei viele verschiedene Agenturen dieselben Sitzplätze an ihren jeweiligen Standorten verkaufen . Lösungen sind unzählig, aber es kommt darauf an, dass es für jedes Teil irgendwo eine endgültige Wahrheitsdatenbank gibt, die den aktuellen Status enthält.
RemcoGerlich
1
@RemcoGerlich: Die Art und Weise, wie Sie "eine letzte Wahrheitsdatenbank" sagen, lässt mich an eine einzelne Maschine denken, auf der sich die große heilige Datenbank befindet . In der Realität geschieht bei kritischen Daten eher, dass alle Transaktionen gleichzeitig mehrere Server erreichen, sodass sichergestellt ist, dass alle diese Datenbanken jederzeit synchron sind.
Arseni Mourzenko

Antworten:

27

Wenn jedoch mehrere Benutzer von unterschiedlichen Servern bedient werden und beide versuchen, denselben Artikel in ihren Warenkorb zu legen, für den nur noch einer übrig ist, muss es eine "Wahrheitsquelle" für die für diesen Artikel verbleibende Menge geben.

Nicht wirklich. Dies ist kein Problem, das eine 100% perfekte technische Lösung erfordert, da beide Fehlerfälle eine Geschäftslösung haben, die nicht sehr teuer ist:

  • Wenn Sie einem Benutzer fälschlicherweise mitteilen, dass ein Artikel ausverkauft ist, verlieren Sie einen Verkauf. Wenn Sie täglich Millionen von Artikeln verkaufen und dies ein- oder zweimal am Tag geschieht, geht dies im Lärm verloren.
  • Wenn Sie eine Bestellung annehmen und während der Bearbeitung feststellen, dass Ihnen der Artikel ausgegangen ist, teilen Sie dies dem Kunden einfach mit und geben ihm die Wahl, zu warten, bis Sie den Vorrat auffüllen können, oder die Bestellung zu stornieren. Sie haben einen leicht genervten Kunden. Wieder kein großes Problem, wenn 99,99% der Bestellungen gut funktionieren.

Tatsächlich habe ich den zweiten Fall vor kurzem selbst erlebt, daher ist das nicht hypothetisch: Das passiert und wie Amazon damit umgeht.

Es ist ein Konzept, das oft angewendet wird, wenn Sie ein Problem haben, das theoretisch sehr schwer zu lösen ist (sei es in Bezug auf Leistung, Optimierung oder was auch immer): Sie können oft mit einer Lösung leben, die für die meisten Fälle wirklich gut funktioniert und das manchmal akzeptieren schlägt fehl, solange Sie die aufgetretenen Fehler erkennen und behandeln können.

Michael Borgwardt
quelle
1
Sie sagten "nicht wirklich", aber ich glaube, Sie stimmen dem zu, was ich vorgeschlagen habe. Es hört sich so an, als würden Sie sagen, wenn der Benutzer nur browst, wir eine zwischengespeicherte Annäherung des verbleibenden Inventars geben, aber nur, wenn er tatsächlich versucht, den Kauf abzuschließen, schreiben wir, um das verbleibende Inventar zu verringern. Die Datenbank, die diesen Wert enthält, führt jede Transaktion atomar aus. Wenn zwei Benutzer gleichzeitig versuchen, wird für den zweiten eine Fehlermeldung angezeigt, da dies unwahrscheinlich ist. Es gibt also irgendwann eine ganze Zahl auf einer einzelnen Maschine, die "die Wahrheit" enthält.
Mattgmg1990
2
@ mattgmg1990: richtig, irgendwann muss man natürlich irgendwo "die Wahrheit" wissen, aber der wichtige Unterschied ist, dass die Verarbeitung von Aufträgen in einer Warteschlange erfolgen kann, so dass überhaupt kein gleichzeitiger atomarer Schreibzugriff erforderlich ist. In meinem Fall kam die "Fehlermeldung" tatsächlich Stunden, nachdem ich die Bestellung auf der Amazon-Website abgeschlossen hatte. Ich erhielt eine E-Mail mit dem Hinweis, dass sie Probleme mit der Lieferung dieses Artikels hatten und ich konnte die Bestellung stornieren oder nichts tun und warten für sie es zu erfüllen. Letzteres habe ich gemacht, da ich den Artikel nicht sofort brauchte und er tatsächlich einige Wochen später geliefert wurde.
Michael Borgwardt
@DerekElkins, das ist ein großartiger Artikel, insbesondere der Punkt, dass digitale Daten eine Darstellung der Realität sind, die unvermeidlich unvollkommen ist, da die Realität immer Änderungen aufweisen kann, über die Ihr System nicht automatisch informiert ist.
Michael Borgwardt
6

Eine Kombination aus

  • Haschisch
  • Scherben
  • Replikation
  • Verteilung
  • hohes Failover
  • Schlüsselwertspeicher

Es gibt keine Magie, nur immer komplexere Situationen. Genau wie DNS ist es maßstabsgetreu.

Die "einzelne Version der Wahrheit" ist Teil solcher Systeme. Das Generieren eines neuen Schlüssels wird zu einer komplexeren Operation, als nur die nächste Nummer in der Sequenz zu generieren. Zum Beispiel existieren andere Sequenzen. Dies ist die Art von Komplexität, die verteilte Datenbanksysteme bewältigen können, indem sie mehrere Vorgänge an und von Komponenten ausführen, wenn sie neue Objekte erstellen, diese anderen zur Verfügung stellen und sicherstellen, dass Sequenzen eindeutig sind, wenn sie benötigt werden, zusammengesetzte Schlüssel usw .

Michael Durrant
quelle
Ich habe über jedes dieser Konzepte gelesen, aber der Teil, an dem ich immer wieder festhalte, ist das spezifische Szenario des verbleibenden Inventars. Wenn nur noch 5 Bücher vorhanden sind und Benutzer Anforderungen auf mehreren Servern stellen, werden sie immer in eine einzelne Datenbanktabelle aufgelöst, wenn der verbleibende Bestand abgefragt werden muss, um sicherzustellen, dass nicht zwei Benutzer gleichzeitig das letzte Buch erhalten können? Durch welche spezielle Verwendung des Obenstehenden wird das gesamte System nicht verlangsamt, und die Replikation kann bei mehreren DB-Instanzen weiterhin hilfreich sein?
mattgmg1990
Ein bisschen mehr hinzugefügt. Ich kann die Komplexität dieses Formats leider nicht wirklich erklären.
Michael Durrant
1
Nur einige Leute interessieren sich für ein bestimmtes Buch. Das bedeutet, dass ein Buch von einer Scherbe mit einer relativ geringen Ladung gehandhabt werden kann.
Basilevs
6
Ich denke, in dem Szenario, in dem Sie das System beschreiben, muss sich der Benutzer nur dafür entschuldigen, dass jemand anderes die letzte Kopie gekauft hat. Ich stelle mir vor, dass dies von Zeit zu Zeit vorkommt.
Matthew James Briggs
1
Ich wette, dass nur noch 5 Bücher übrig sind. Der Indikator ist weniger Computer und mehr Marketing.
Mouviciel
5

Ich habe das Problem "Letzter Artikel auf Lager" folgendermaßen gelöst:

Aktualisieren Sie täglich alle Lagerbestände und kennzeichnen Sie Produkte entsprechend den Schwellenwerten als hoch, niedrig, auf Bestellung oder außerhalb der Lagerbestandskategorien.

Offensichtlich ist es der "geringe Lagerbestand" Artikel, die problematisch sind

  • Artikel mit hohen Lagerbeständen

Prüfen Sie nicht den Lagerbestand. Bestellen Sie einfach

  • Artikel mit geringen Lagerbeständen

Warnen Sie den Benutzer beim Durchsuchen von "Letzte verbleibende!". Wenn sie zahlen müssen, überprüfen Sie den Lagerbestand und verringern Sie ihn. Wenn es nicht mehr auf Lager ist, aktualisieren Sie den Artikelstatus.

Auf diese Weise gelangen Sie nur in die Datenbank für Artikel mit geringem Lagerbestand, und dies nur, wenn der Kunde den Kaufprozess noch nicht abgeschlossen hat. Die Kosten sind, dass einige Kunden ihren Kauf nicht abschließen können.

In den meisten Fällen bedeutet "Nicht vorrätig" jedoch, dass Sie auf eine weitere Lieferung warten. Sie möchten die Bestellung also trotzdem annehmen und möglicherweise nur eine Warnung anzeigen oder die Lieferoptionen einschränken. Diese Kunden sind also nicht verloren.

In Zeiten mit hoher Auslastung, wie zum Beispiel beim Verkauf, können Sie sogar die Lagerprüfung deaktivieren und Kunden später eine E-Mail senden: "Es tut uns leid, wir haben kein X mehr, möchten Sie Y".

Grundsätzlich wird das Ziel einer E-Commerce-Plattform niemals aus der Datenbank gelesen. Servieren Sie immer zwischengespeicherte Seiten und erledigen Sie alles clientseitig.

Ewan
quelle
2

In diesem Video behandelt Martin Fowler NoSQL-Datenbanken:

https://www.youtube.com/watch?v=qI_g07C_Q5I

Einer der Punkte (irgendwo da drin) ist, dass Orte wie Amazon lieber 99% der Leute bei Laune halten, wenn sie ihre Bestellung annehmen, ohne "sicher" überprüfen zu können, ob sie tatsächlich verfügbar ist, und vielleicht einen sehr kleinen Prozentsatz irritieren, wenn sie haben zu sagen "Entschuldigung, sieht aus, als hätte dich jemand geschlagen."

Das heißt, es gibt keine wirkliche Handhabung für das von Ihnen beschriebene Szenario, nur, dass Amazon den Zweifel ausnutzt, der auf dem zuletzt erfolgreich gelesenen Inventar basiert, und wenn eine gleichzeitige Transaktion dazwischen gerutscht ist - oopsie.

(Übrigens, das ist ein großartiges Video, wenn Sie neugierig auf NoSQL sind.)

JLeach
quelle