Heim > Datenbank > Redis > Hauptteil

So implementieren Sie die Aufgabenplanung basierend auf der verteilten Redis-Sperre

WBOY
Freigeben: 2023-05-28 13:37:30
nach vorne
661 Leute haben es durchsucht

Im Prozess der verteilten groß angelegten Datenerfassung ist die Verwaltung von Informationsquellen besonders wichtig. Um sicherzustellen, dass dieselbe Aufgabe gleichzeitig nur von einem Sammler bearbeitet werden kann, muss die Eindeutigkeit der Aufgabenplanung sichergestellt werden. Wenn wir eine verteilte Datenerfassung durchführen, gibt es normalerweise ein Planungsmodul, dessen Hauptaufgabe darin besteht, die Erfassungsaufgaben zu verteilen und die Einzigartigkeit der Aufgaben sicherzustellen.

Da es verteilt ist und mehrere Server (mehrere Maschinen) umfasst, umfasst jeder Server mehrere Kollektoren (mehrere Prozesse) und jeder Kollektor kann mehrere Threads umfassen, daher ist der Sperrmechanismus des Aufgabenplanungsmoduls besonders wichtig. Abhängig von der Implementierungsarchitektur der Anwendung können Sperrimplementierungsmethoden normalerweise in die folgenden Typen unterteilt werden:

  • Wenn der Handler ein Einzelprozess- und Multithread-Handler ist, können Sie unter Python das Lock-Objekt des Threading-Moduls verwenden um die gemeinsame Nutzung einzuschränken. Synchroner Zugriff auf Variablen, um Thread-Sicherheit zu erreichen.

  • Im Fall einer einzelnen Maschine und mehrerer Prozesse können Sie unter Python das Lock-Objekt der Mehrfachverarbeitung verwenden, um damit umzugehen.

  • Bei der Bereitstellung auf mehreren Maschinen und in mehreren Prozessen müssen Sie sich auf eine Komponente eines Drittanbieters (Speichersperrobjekt) verlassen, um eine verteilte Synchronisierungssperre zu implementieren.

Da es sich bei dem Planungsmodul um einen Verarbeitungsmechanismus für mehrere Maschinen, mehrere Prozesse und mehrere Threads handelt, stimmt es mit der dritten Methode überein.

Methoden zur Implementierung verteilter Sperren

Die aktuellen Mainstream-Methoden zur Implementierung verteilter Sperren lauten wie folgt:

  • Basierend auf Datenbanken wie MySQL

  • Basierend auf Caches wie Redis

  • Basierend auf zookeeper zu implementieren

Jede Implementierungsmethode hat ihre eigenen Vorteile. Nach umfassender Überlegung ist Redis die am besten geeignete Wahl. Der Hauptgrund ist:

  • redis arbeitet speicherbasiert und die Zugriffsgeschwindigkeit ist schneller als die der Datenbank, sodass die Leistung nach dem Sperren nicht zu stark abnimmt.

  • redis kann die Überlebenszeit festlegen von Schlüsselwerten. (TTL)

  • redis ist einfach zu verwenden und hat insgesamt einen geringen Implementierungsaufwand

Mit Redis implementierte verteilte Sperren müssen jedoch auch die folgenden Bedingungen erfüllen:

  1. Es kann nur gleichzeitig einer sein Der Thread belegt die Sperre, und andere Threads müssen warten, bis die Sperre aufgehoben wird. Der Sperrvorgang muss die Atomizität erfüllen Die Sperre wird plötzlich abnormal beendet, bevor die Sperre aufgehoben wird, was dazu führt, dass andere Threads in einer Schleife auf die Freigabe der Sperre warten. Das Hinzufügen und Freigeben der Sperre muss vom selben Thread festgelegt werden. Wir Verwenden Sie Redis, um eine verteilte Synchronisationssperre zu implementieren, um die Konsistenz der Daten sicherzustellen:

  2. erfüllt die gegenseitige Ausschließlichkeit, nur ein Thread kann die Sperre gleichzeitig erwerben
  3. Verwenden Sie die TTL von redis, um sicherzustellen, dass kein Deadlock auftritt, aber auch zum Ablauf der Sperre führt. Das Problem, dass mehrere Threads gleichzeitig Sperren belegen, erfordert, dass wir die Ablaufzeit der Sperre angemessen festlegen, um dies zu vermeiden
  4. Verwenden Sie die Einzigartigkeit der Sperre um sicherzustellen, dass die Sperre nicht versehentlich gelöscht wird. Performance-Java-Client zum Herstellen einer Verbindung mit der Redis-Distributed-Hash-Schlüsselwertdatenbank, der Spring Boot verwendet, um synchrone und asynchrone Funktionen zu implementieren, sodass andere Collectors die Verarbeitung von Erfassungsaufgaben über HTTP anfordern können wie folgt:


Der Sammler sendet Aufgabenanfragen über HTTP an das Versandzentrum.