Heim  >  Artikel  >  Datenbank  >  So implementieren Sie die Aufgabenplanung basierend auf der verteilten Redis-Sperre

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

WBOY
WBOYnach vorne
2023-05-28 13:37:30665Durchsuche

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.

  • Das Versandzentrum stellt fest, ob die Sperre vorhanden ist, und gibt, falls vorhanden, direkt einen leeren Satz zurück Wenn die Sperre nicht vorhanden ist, sperrt sie die Anforderung und ruft dann die entsprechende Sammelaufgabe gemäß den Quellregeln ab

  • Die Code-Implementierung des Planungsmoduls sieht ungefähr wie folgt aus:
  • public static ListString lockKeyValue, RedisHashUtils redisHashUtils, HttpServletRequest request,
  • HashServiceInterface hif, ZSetServiceInterface zScoreSet, String dicName) {

    Liste< ;Object> result = new ArrayList();   try {


      String dicNameLock = "Dispatcher_Task_Lock";//Task scheduling Lock; f If (! Redishashutils.Keyisexit (DICNAMELOCK, LOCKKEYVALUE)) {// Bestimmen Sie, ob Es gibt eine Sperre

    // Sperren hinzufügen (Datensätze des einzigartigen Logos der Mission schreiben); CNAMELOCK, LOCKKEYVALUE ,

                     DateUtil.getYMDHMS());

                                                                                                                                                                 // Verarbeitungsaufgabenlogik

                                                            
                                                             Leider haben Sie nicht die ursprünglichen Wörter angegeben, die neu geschrieben werden müssen und nicht ausgeführt werden können

      Im eigentlichen Betriebsprozess müssen Sie beim Hinzufügen einer Sperre der Sperre die

      Ablaufzeit

      hinzufügen. Andernfalls wird die Sperre beim Auftreten einer unbekannten Ausnahme möglicherweise nicht aufgehoben und der Collector kann die Erfassungsaufgabe niemals erhalten.

    Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Aufgabenplanung basierend auf der verteilten Redis-Sperre. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen