2016-03-14 1 views
0

Lecteur de longue date, mais premier affichage.La modification du préfixe de cache Laravel dans la commande de file d'attente exécutée par le démon de travail n'a aucun effet.

Je me suis cogné la tête sur un problème apparemment simple mais qui semble n'avoir aucune solution jusqu'à présent. Ici rien ne va ...

Nous exécutons une API Laravel 5.1, qui dans certains cas met en file d'attente des commandes pour provisionner des instances de serveur avec divers paquets et paramètres. Chaque instance a un identifiant spécifique, qui est inclus dans les données de l'élément de la file d'attente. Cet identifiant d'instance est à son tour utilisé comme préfixe pour les clés de cache Redis. Par exemple: "instance-0: clients: list" pour une liste de clients s'exécutant sur l'ID d'instance 0. Le paramètre de configuration "cache.prefix" est mis à jour via un middleware avec l'ID d'instance actuel.

Divers points de terminaison de création/mise à jour/suppression «oublient» les clés de cache, qui sont ensuite reconstruites lorsque les points de terminaison de liste/affichage sont appelés. Tout va bien et dandy jusqu'à ce moment où ces actions se produisent directement à travers les points de terminaison de l'API. Cela fonctionne aussi si je cours manuellement la file avec "artisan queue: work".

MAIS ...

La file d'attente est régulièrement exécuté comme un démon par supervisord. Lorsque la file d'attente s'exécute en tant que démon, le préfixe du cache n'est jamais modifié car (j'imagine) il ne passe pas par le middleware lorsqu'il exécute un élément de file d'attente donné. Cela arrive aussi si je cours manuellement la file d'attente (pas par supervord).

J'ai essayé de forcer la valeur par \ Config :: set ('cache.prefix', 'instance-X') ainsi que putenv ('CACHE_PREFIX = instance-X') mais ils n'ont aucun effet sur le préfixe réel utilisé par le magasin de cache lui-même. La seule façon que j'ai réussi à définir avec succès était de définir CACHE_PREFIX dans le fichier ".env" mais cela ne fonctionne pas avec l'architecture out. Nous exécutons des instances API et de travail dans des conteneurs Docker et les agents ne sont pas spécifiques à une instance d'API donnée, d'où l'inclusion de l'ID d'instance dans les données d'élément de file d'attente pour une utilisation ultérieure. Donc, je suis un peu en stock quant à la façon dont je peux définir le préfixe de cache sur une base par élément de la file d'attente. Est-ce que c'est possible? Toute aide serait grandement appréciée!

Cordialement,

Christophe

Répondre

0

Essayez la méthode Cache :: setPrefix ('exemple-X'). Cela forcera le préfixe du cache à changer pour la requête donnée. Cela devrait fonctionner pour vous puisque j'avais un cas d'utilisation similaire mais que j'en avais besoin pour gérer mon cache. Cela peut fonctionner ou non, je n'ai pas testé cela avec des files d'attente mais puisque le préfixe de cache est partagé par les pilotes de session et de file d'attente dans laravel, cela devrait fonctionner.

Juste pour être clair, la méthode n'affecte pas les valeurs de configuration. Si vous utilisez config ('cache.prefix') pour obtenir le préfixe de cache immédiatement après l'exécution de la méthode, la valeur sera toujours celle dans votre fichier de configuration.