


Aufbau eines skalierbaren Slot-Buchungssystems mit Redis Distributed Locks
In der heutigen schnelllebigen digitalen Welt sind nahtlose und skalierbare Buchungssysteme unerlässlich, insbesondere wenn mehrere Benutzer gleichzeitig versuchen, dasselbe Zeitfenster zu buchen. In diesem Blog wird ein Low-Level-Design eines Slot-Buchungssystems unter Verwendung von Redis für die verteilte Sperrung beschrieben, das sicherstellt, dass Benutzer Slots buchen können, ohne auf Rennbedingungen zu stoßen. Durch die Nutzung von Redis können wir Parallelität und Skalierbarkeit verwalten und so sicherstellen, dass unser Buchungssystem auch bei hoher Nachfrage effizient funktioniert.
Schlüsselkomponenten des Systems
Bevor wir uns mit den technischen Aspekten befassen, wollen wir die Kernkomponenten aufschlüsseln:
- Benutzer: Stellt Personen dar, die das System zum Buchen von Slots nutzen.
- Slot: Stellt zeitgebundene Einheiten (z. B. Besprechungsräume, Veranstaltungen) dar, die Benutzer buchen können.
- Redis Distributed Lock: Die Schlüsselfunktion, die sicherstellt, dass zwei Benutzer nicht gleichzeitig denselben Slot buchen können.
- MongoDB: Speichert die Benutzer- und Slot-Informationen.
- Redis: Fungiert als Lock-Manager zur Verwaltung der Rennbedingungen.
Die Herausforderungen von Buchungssystemen
Buchungssysteme können leicht Opfer von Problemen wie Doppelbuchungen oder Rennbedingungen werden, wenn mehrere Benutzer gleichzeitig versuchen, denselben Slot zu buchen. Ohne ordnungsgemäße Parallelitätskontrolle kann es passieren, dass zwei Benutzer versehentlich denselben Slot buchen, was zu Frustration und Konflikten führt.
Hier kommen verteilte Redis-Sperren ins Spiel. Durch die Verwendung einer Sperre wird sichergestellt, dass jeweils nur ein Benutzer einen Slot buchen kann.
1. Modelle: Benutzer und Slots definieren
Zunächst müssen wir unsere Datenmodelle für Benutzer und Slots entwerfen. Diese Modelle werden in MongoDB gespeichert und ihre Struktur ist einfach, aber effektiv.
A. Benutzermodell
Jeder Benutzer verfügt über grundlegende Attribute wie einen Namen, eine E-Mail-Adresse und ein gehashtes Passwort zur Authentifizierung:
const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('User', UserSchema);
B. Slot-Modell
Jeder Slot hat eine Start- und Endzeit und es wird erfasst, ob und von wem er gebucht wurde:
const mongoose = require('mongoose'); const SlotSchema = new mongoose.Schema({ startTime: { type: Date, required: true }, endTime: { type: Date, required: true }, isBooked: { type: Boolean, default: false }, bookedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', default: null } }); module.exports = mongoose.model('Slot', SlotSchema);
2. API-Endpunkte: Wie Benutzer mit dem System interagieren
APIs sind die Brücke zwischen Benutzern und dem System. Hier sind die wichtigsten benötigten Endpunkte:
A. Benutzerregistrierung
Ermöglicht die Registrierung eines neuen Benutzers:
- Endpunkt: POST /api/users/register
- Anfrage: Benutzerdaten (Name, E-Mail, Passwort)
- Antwort: Bestätigung der Benutzerregistrierung
B. Benutzeranmeldung
Authentifiziert den Benutzer und stellt ein JWT-Token bereit:
- Endpunkt: POST /api/users/login
- Anfrage: Benutzeranmeldeinformationen (E-Mail, Passwort)
- Antwort: JWT-Token zur Authentifizierung
C. Slot erstellen
Ermöglicht Administratoren oder autorisierten Benutzern das Erstellen von Slots:
- Endpunkt: POST /api/slots/create
- Anfrage: Start- und Endzeiten des Slots
- Antwort: Bestätigung der Slot-Erstellung
D. Bücherfach
Ermöglicht Benutzern die Buchung verfügbarer Slots:
- Endpunkt: POST /api/slots/book/:id
- Anfrage: JWT-Token im Header, Slot-ID in der URL
- Antwort: Bestätigung der Slot-Buchung oder Fehler (z. B. wenn der Slot bereits gebucht ist)
3. Wie Redis Distributed Locks funktionieren
Parallelität ist die größte Herausforderung für Buchungssysteme. Wenn mehrere Benutzer gleichzeitig versuchen, denselben Slot zu buchen, kommt Redis mit seinen verteilten Sperrfunktionen zu Hilfe.
Der Buchungsprozess mit Redis Locks
-
Erfassung sperren:
- Wenn ein Benutzer versucht, einen Slot zu buchen, versucht das System, mit dem NX EX 10-Befehl SET lock_key eine Sperre in Redis zu erhalten.
- Der NX (festgelegt, wenn nicht vorhanden) stellt sicher, dass die Sperre nur dann erstellt wird, wenn sie noch nicht vorhanden ist, während EX 10 dafür sorgt, dass die Sperre nach 10 Sekunden abläuft (verhindert). Deadlocks).
- Wenn die Sperre bereits erworben wurde, gibt das System den Status „423 Gesperrt“ zurück und informiert den Benutzer darüber, dass der Slot von einer anderen Person gebucht wird.
-
Slot-Verfügbarkeitsprüfung:
- Wenn die Sperre erfolgreich erworben wurde, wird MongoDB abgefragt, um zu prüfen, ob der Slot noch verfügbar (d. h. nicht gebucht) ist.
- Wenn der Slot verfügbar ist, aktualisiert das System den Status des Slots auf „Gebucht“ und setzt das Feld „BookedBy“ auf die ID des aktuellen Benutzers.
-
Sperrfreigabe:
- Sobald der Buchungsvorgang abgeschlossen ist oder ein Fehler auftritt, hebt das System die Sperre auf, indem es den Redis-Schlüssel mit dem Befehl DEL lock_key löscht.
Beispielcode für die Buchung eines Slots mit Redis Locks:
const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('User', UserSchema);
4. Fehlerbehandlung im Buchungssystem
Der ordnungsgemäße Umgang mit Fehlern ist ein wesentlicher Bestandteil jedes robusten Systems. Hier sind einige der Fehler, die das System behandelt:
- 400 Bad Request: Wenn die Eingabedaten ungültig sind.
- 404 Nicht gefunden: Wenn der angeforderte Slot oder Benutzer nicht gefunden wird.
- 423 gesperrt: Wenn ein Slot gerade von einem anderen Benutzer gebucht wird.
- 500 Interner Serverfehler: Für alle unerwarteten Fehler, wie Datenbank- oder Redis-Fehler.
5. Sicherung des Systems
Sicherheit ist von entscheidender Bedeutung, insbesondere wenn Benutzer Ressourcen buchen. So sorgt das System für Sicherheit:
- JWT-Authentifizierung: Für jede Anfrage zur Slot-Buchung ist ein gültiges JWT-Token erforderlich, um sicherzustellen, dass nur authentifizierte Benutzer auf das System zugreifen können.
- Datenvalidierung: Eingabedaten werden bei jedem Schritt validiert, um zu verhindern, dass ungültige oder schädliche Daten verarbeitet werden.
- Ablauf der Sperre: Redis-Sperren verfügen über eine integrierte Ablaufzeit (10 Sekunden), um Deadlocks zu verhindern, wenn ein Buchungsvorgang mittendrin fehlschlägt.
6. Überlegungen zur Skalierbarkeit
Das System ist auf Skalierbarkeit ausgelegt. Bei steigender Nachfrage können folgende Strategien für einen reibungslosen Betrieb sorgen:
- Redis für Parallelität: Redis-Sperren stellen sicher, dass Race Conditions vermieden werden, auch wenn mehrere Instanzen der Anwendung ausgeführt werden.
- Redis-Clustering: Wenn das System erheblich wächst, kann Redis-Clustering verwendet werden, um die Last auf mehrere Redis-Knoten zu verteilen und so die Leistung zu verbessern.
Abschluss
Der Aufbau eines skalierbaren und zuverlässigen Slot-Buchungssystems erfordert eine sorgfältige Berücksichtigung von Parallelität, Datenintegrität und Sicherheit. Durch die Verwendung von Redis Distributed Locks können wir sicherstellen, dass nicht zwei Benutzer gleichzeitig denselben Slot buchen, wodurch Race Conditions vermieden werden. Darüber hinaus ist dieses System durch die Nutzung von MongoDB für die Datenpersistenz und JWT für die Authentifizierung sicher, skalierbar und effizient.
Ob Sie ein Buchungssystem für Besprechungsräume, Veranstaltungen oder andere zeitgebundene Ressourcen entwerfen, diese Architektur bietet eine solide Grundlage für die zuverlässige Verwaltung von Buchungen unter hoher Auslastung.
Das obige ist der detaillierte Inhalt vonAufbau eines skalierbaren Slot-Buchungssystems mit Redis Distributed Locks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

C und C spielen eine wichtige Rolle in der JavaScript -Engine, die hauptsächlich zur Implementierung von Dolmetschern und JIT -Compilern verwendet wird. 1) C wird verwendet, um JavaScript -Quellcode zu analysieren und einen abstrakten Syntaxbaum zu generieren. 2) C ist für die Generierung und Ausführung von Bytecode verantwortlich. 3) C implementiert den JIT-Compiler, optimiert und kompiliert Hot-Spot-Code zur Laufzeit und verbessert die Ausführungseffizienz von JavaScript erheblich.
