Maison  >  Article  >  développement back-end  >  À propos du principe de mise en œuvre de la file d'attente Laravel et comment résoudre le problème

À propos du principe de mise en œuvre de la file d'attente Laravel et comment résoudre le problème

不言
不言original
2018-06-13 11:45:522362parcourir

Cet article présente principalement une brève discussion sur les principes d'implémentation de la file d'attente Laravel et les enregistrements de résolution de problèmes. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.

Problème

Les deux projets développés par la société utilisant Laravel sont déployés sur le même serveur de test et partagent le même redis. Lors de l'utilisation de files d'attente dans Laravel, des conflits se produisent.

Trouvez la cause du problème

Vous pouvez voir la méthode IlluminateQueueRedisQueue.php dans la classe d'opération pushRaw() de la file d'attente laravel :

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

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

On peut voir à partir de cette méthode que l'implémentation redis de la file d'attente Lrarvel est implémentée via la structure de liste rpush(key, value) consiste à pousser la valeur dans la file d'attente redis avec la clé. valeur comme clé, et la valeur de la clé est $this->getQueue($queue)

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

obtenue via

, donc la clé dans la liste dans redis est épissée par 'queues:'.($queue ?: $this->default);, et la valeur de $this->default est RedisQueue est chargée à partir de la configuration configqueue.php lors de l'instanciation. $queue est transmis lors de l'ajout d'une file d'attente. 'queue' => 'default'$this->dispatch( new jobClass()->onQueue($queue) )

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

À ce stade, la cause du conflit de file d'attente entre les deux projets a été trouvée. Étant donné que

dans la configuration de la file d'attente Redis utilise tous la valeur par défaut, lors du partage de Redis, la liste de files d'attente par défaut est entièrement « file d'attente : par défaut », ce qui entraîne des conflits.

'queue' => 'default' Parce que le nom de la file d'attente surveillée par la surveillance de la file d'attente est déterminé par le paramètre --queue, s'il n'est pas transmis, ce sera la valeur par défaut que nous avons définie ci-dessus. S'il est transmis, il sera traité dans l'ordre. d'avant en arrière selon le nom de la file d'attente entrante, voir le code

pour plus de détails :

IlluminateQueueWorker.php

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 est le paramètre transmis par. --queue=. Lorsque $queue n'existe pas, il est appelé directement

Lorsque le paramètre existe, le paramètre sera analysé et le nom de la file d'attente devant sera traité en premier. va essayer d'obtenir la tâche de file d'attente à partir de la file d'attente spécifiée ou de la file d'attente par défaut

$connection->pop()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);
    }
  }
Nous comprenons maintenant le principe d'exécution de la file d'attente.

Solution

Modifiez la file d'attente par défaut dans le fichier de configuration de la file d'attente en un nom différent, tel que : 'queue' => ; laravel2'.

Surveillance des files d'attente

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

Si vous rencontrez un problème, ne vous précipitez pas chez le médecin. Commencez par le code, analysez et comprenez les principes de mise en œuvre et trouvez le bon point. La solution peut être simple.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Analyse de la méthode d'utilisation de la file d'attente de messages et de la file d'attente asynchrone dans le framework Laravel de PHP


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn