Heim >Web-Frontend >js-Tutorial >Aufbau eines skalierbaren Slot-Buchungssystems mit Redis Distributed Locks

Aufbau eines skalierbaren Slot-Buchungssystems mit Redis Distributed Locks

Patricia Arquette
Patricia ArquetteOriginal
2024-10-22 20:48:28632Durchsuche

Building a Scalable Slot Booking System with 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:

  1. Benutzer: Stellt Personen dar, die das System zum Buchen von Slots nutzen.
  2. Slot: Stellt zeitgebundene Einheiten (z. B. Besprechungsräume, Veranstaltungen) dar, die Benutzer buchen können.
  3. Redis Distributed Lock: Die Schlüsselfunktion, die sicherstellt, dass zwei Benutzer nicht gleichzeitig denselben Slot buchen können.
  4. MongoDB: Speichert die Benutzer- und Slot-Informationen.
  5. 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

  1. 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.
  2. 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.
  3. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn