Heim  >  Artikel  >  Backend-Entwicklung  >  Über das Implementierungsprinzip der Laravel-Warteschlange und wie das Problem gelöst werden kann

Über das Implementierungsprinzip der Laravel-Warteschlange und wie das Problem gelöst werden kann

不言
不言Original
2018-06-13 11:45:522305Durchsuche

Dieser Artikel führt hauptsächlich eine kurze Diskussion der Implementierungsprinzipien der Laravel-Warteschlange und der Problemlösungsaufzeichnungen ein. Der Inhalt ist jetzt recht gut und dient als Referenz.

Problem

Die beiden vom Unternehmen unter Verwendung von Laravel entwickelten Projekte werden auf demselben Testserver bereitgestellt und verwenden dieselben Redis. Bei der Verwendung von Warteschlangen in Laravel kommt es zu Konflikten.

Finden Sie die Ursache des Problems

Sie können die IlluminateQueueRedisQueue.php-Methode in der Operationsklasse pushRaw() der Laravel-Warteschlange sehen:

// 将一任务推入队列中
public function pushRaw($payload, $queue = null, array $options = [])
  {
    $this->getConnection()->rpush($this->getQueue($queue), $payload);

    return Arr::get(json_decode($payload, true), 'id');
  }

Aus dieser Methode ist ersichtlich, dass die Redis-Implementierung der Lrarvel-Warteschlange durch die Listenstruktur implementiert wird. rpush(key, value) besteht darin, den Wert mit dem Schlüsselwert als in die Redis-Warteschlange zu verschieben Schlüssel, und der Wert des Schlüssels ist durch $this->getQueue($queue) Das erhaltene

protected function getQueue($queue)
  {
    return 'queues:'.($queue ?: $this->default);
  }

, sodass die Schlüssel in der Liste in Redis durch 'queues:'.($queue ?: $this->default); gespleißt werden , und der Wert von $this->default wird durch RedisQueue instanziiert. configqueue.php wird aus der 'queue' => 'default'-Konfiguration geladen, und $queue wird übergeben, wenn eine Warteschlange $this->dispatch( new jobClass()->onQueue($queue) ) hinzugefügt wird.

// config\queue.php 文件中的redis配置部分
'redis' => [
      'driver'   => 'redis',
      'connection' => 'default',
      'queue'   => 'default',
      'expire'   => 60,
    ],

Zu diesem Zeitpunkt wurde die Ursache für den Warteschlangenkonflikt zwischen den beiden Projekten gefunden. Da 'queue' => 'default' in der Redis-Warteschlangenkonfiguration alle den Standardstandard verwenden, lautet die Standardwarteschlangenliste bei der Freigabe von Redis alle „queue:default“, was zu Konflikten führt.

Da der von der Warteschlangenüberwachung überwachte Warteschlangenname durch den Parameter --queue bestimmt wird, ist er der oben festgelegte Standardwert. Wenn er übergeben wird, wird er der Reihe nach verarbeitet Von vorne nach hinten entsprechend dem Namen der eingehenden Warteschlange, siehe Code IlluminateQueueWorker.php für Details:

protected function getNextJob($connection, $queue)
  {
    if (is_null($queue)) {
      return $connection->pop();
    }

    foreach (explode(',', $queue) as $queue) {
      if (! is_null($job = $connection->pop($queue))) {
        return $job;
      }
    }
  }

$queue ist der von -- übergebene Parameter. queue=. Wenn $queue nicht vorhanden ist, wird es direkt aufgerufen. $connection->pop()Wenn der Parameter vorhanden ist, wird der Parameter zuerst analysiert und der Warteschlangenname wird zuerst verarbeitet. Es wird versucht, die Warteschlangenaufgabe aus der angegebenen Warteschlange oder der Standardwarteschlange abzurufen pop($queue), pop()

// Illuminate\Queue\RedisQueue.php
public function pop($queue = null)
  {
    $original = $queue ?: $this->default;

    $queue = $this->getQueue($queue);

    if (! is_null($this->expire)) {
      $this->migrateAllExpiredJobs($queue);
    }

    $job = $this->getConnection()->lpop($queue);

    if (! is_null($job)) {
      $this->getConnection()->zadd($queue.':reserved', $this->getTime() + $this->expire, $job);

      return new RedisJob($this->container, $this, $job, $original);
    }
  }

Jetzt verstehen wir das Prinzip der Warteschlangenausführung.

Lösung

Ändern Sie die Standardwarteschlange in der Warteschlangenkonfigurationsdatei in einen anderen Namen, z. B.: 'queue' => ; laravel2'.

Warteschlangenüberwachung

php artisan queue:listen redis --queue=laravel1,syncExpress

Endlich

Wenn Sie auf ein Problem stoßen, eilen Sie nicht zum Arzt. Beginnen Sie mit dem Code, analysieren und verstehen Sie die Implementierungsprinzipien und finden Sie den richtigen Punkt. Die Lösung kann einfach sein.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Analyse der Methode zur Verwendung der Nachrichtenwarteschlange und der asynchronen Warteschlange im Laravel-Framework von PHP

Das obige ist der detaillierte Inhalt vonÜber das Implementierungsprinzip der Laravel-Warteschlange und wie das Problem gelöst werden kann. 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