Dragonfly est une alternative à Redis conçue pour offrir des performances nettement supérieures avec bien moins de serveurs. Un seul nœud peut gérer des millions de requêtes par seconde et jusqu’à 1 To de données en mémoire. Dans cet article, nous allons explorer comment utiliser Dragonfly avec Laravel, l’un des frameworks web les plus largement utilisés et connus.
Dragonfly est totalement compatible avec l’interface Redis, ce qui signifie que les développeurs Laravel peuvent l’intégrer en tant que pilote de cache et de file d’attente sans modifier une seule ligne de code. Cette intégration transparente peut offrir un chemin d’amélioration sans effort avec des avantages considérables.
Que vous soyez un vétéran chevronné de Laravel ou tout juste débutant, rejoignez-nous pour entrer dans le monde de Dragonfly et Laravel.
Démarrage
Commençons par configurer une nouvelle instance de Dragonfly. Consultez notre documentation ici pour télécharger une image ou le binaire et avoir une instance de Dragonfly opérationnelle en un rien de temps. Une fois que l’instance Dragonfly est opérationnelle et accessible, l’intégration avec votre projet Laravel est un jeu d’enfant. Heureusement, Laravel prend déjà pleinement en charge Redis, donc tous ses pilotes peuvent être réutilisés. Pour utiliser Dragonfly dans votre application Laravel, commencez par mettre à jour le fichier .env
avec les configurations suivantes.
Pour le cache et la gestion des sessions:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
Pour intégrer Dragonfly en tant que pilote de file d’attente également:
QUEUE_CONNECTION=redis
Même si nous utilisons redis
comme valeur du pilote, Dragonfly est conçu pour être une substitution directe pour Redis, donc aucune installation de pilote supplémentaire n’est requise. Avec le pilote configuré, l’étape suivante consiste à s’assurer que Laravel peut communiquer avec l’instance Dragonfly. Cela implique de mettre à jour à nouveau le fichier .env
avec les détails de connexion corrects :
REDIS_HOST
: Le nom d’hôte ou l’adresse IP du serveur Dragonfly.REDIS_PORT
: Le port sur lequel l’instance Dragonfly est en cours d’exécution.REDIS_PASSWORD
: Le mot de passe pour l’instance Dragonfly, s’il est défini.
Voici un exemple de configuration :
REDIS_HOST=127.0.0.1 # Replace with Dragonfly host
REDIS_PORT=6379 # Replace with Dragonfly port
REDIS_PASSWORD=null # Replace with Dragonfly password if applicable
Après la mise à jour de ces paramètres, vérifiez la connexion en exécutant une opération simple comme INFO
dans Laravel. Si vous rencontrez des problèmes de connectivité, vérifiez à nouveau les valeurs de l’hôte, du port et du mot de passe. Assurez-vous également que le serveur Dragonfly est en cours d’exécution et accessible depuis l’environnement de votre application Laravel.
use Illuminate\Support\Facades\Redis;
// Exécutez la commande INFO et imprimez la version Dragonfly.
Redis::info()["dragonfly_version"];
Plus d’efficacité en tant que cache
Le cache des valeurs fréquemment consultées est l’une des utilisations principales des bases de données en mémoire comme Dragonfly et Redis en raison de leurs temps de réponse rapides. C’est là que Dragonfly brille, surtout dans les scénarios impliquant un grand nombre de clés et de clients, typiques en tant que cache central de systèmes multi-nœuds ou de microservices.
A standout feature of Dragonfly is the cache mode, designed specifically for scenarios where maintaining a lean memory footprint is as crucial as performance. In this mode, Dragonfly evicts the least recently accessed values when it detects low memory availability, ensuring efficient memory usage without sacrificing speed. You can read more about the eviction algorithm in the Dragonfly Cache Design blog post.
Activer le mode cache est simple. Voici les drapeaux que vous utiliseriez pour exécuter Dragonfly en mode cache, avec une limite de mémoire de 12 Go :
./dragonfly --cache_mode --maxmemory=12G
Considérons un scénario où votre application doit gérer un volume élevé de requêtes avec un jeu de données vaste. Dans de telles situations, le mode cache Dragonfly peut gérer efficacement l’utilisation de la mémoire tout en offrant un accès rapide aux données, garantissant que votre application reste réactive et agile.
API-wise, toutes les fonctionnalités de la facade Laravel Cache devraient être prises en charge. Par exemple, pour stocker une clé et une valeur avec un temps d’expiration spécifique, le fragment de code suivant peut être utilisé:
use Illuminate\Support\Facades\Cache;
// Stocker une valeur avec un temps d'expiration de 10 minutes.
Cache::put("key", "value", 600);
Utilisation de la mémoire
L’un des avantages de l’utilisation de Dragonfly comme cache est sa consommation de mémoire nettement inférieure pour la plupart des cas d’utilisation. Effectuons une expérience simple et remplissons à la fois Redis et Dragonfly avec des chaînes aléatoires, mesurant leur utilisation totale de la mémoire après les avoir remplies de données.
Dataset | Dragonfly | Redis |
---|---|---|
3 Million Values of Length 1000 | 2.75GB | 3.17GB |
15 Million Values of Length 200 | 3.8GB | 4.6GB |
Après avoir mené l’expérience, nous avons constaté que l’utilisation de la mémoire de Dragonfly est jusqu’à 20% inférieure à celle de Redis dans des conditions similaires. Cela vous permet de stocker considérablement plus de données utiles avec les mêmes exigences en matière de mémoire, rendant le cache plus efficace et obtenant une couverture plus élevée. Vous pouvez en savoir plus sur les benchmarks de débit et l’utilisation de la mémoire de Dragonfly dans le billet de blog sur la scalabilité et la performance de Redis vs. Dragonfly.
Snapshotting
Au-delà de la réduction de la consommation mémoire, Dragonfly démontre également une stabilité lors des processus de prise de snapshot. La prise de snapshot, particulièrement dans les instances très actives, peut être un défi en termes de gestion de la mémoire. Avec Redis, capturer un snapshot sur une instance très active peut entraîner une augmentation de la consommation mémoire. Cela se produit parce que Redis doit copier des pages mémoire, même celles qui ont été partiellement écrasées, ce qui entraîne une augmentation soudaine de la consommation mémoire.
En revanche, Dragonfly ajuste l’ordre de la prise de snapshot en fonction des requêtes entrantes, prévenant efficacement toute augmentation inattendue de la consommation mémoire. Cela signifie qu’même lors d’opérations intensives comme la prise de snapshot, Dragonfly maintient une empreinte mémoire stable, garantissant une performance constante sans risque de pics mémoire soudains. Vous pouvez en savoir plus sur l’algorithme de prise de snapshot de Dragonfly dans le billet de blog Équilibré vs. Déséquilibré.
Stickiness des clés
Dragonfly introduit également une nouvelle fonctionnalité avec sa commande personnalisée STICK
. Cette commande est particulièrement utile dans les instances en mode cache. Elle permet de marquer certaines clés comme non évictables, indépendamment de leur fréquence d’accès.
Cette fonctionnalité est particulièrement pratique pour stocker des données importantes mais peu consultées. Par exemple, vous pouvez stocker en toute sécurité des informations auxiliaires, telles que des valeurs de configuration dynamiques, directement sur votre instance Dragonfly. Cela élimine le besoin d’un magasin de données distinct pour les données peu utilisées mais cruciales, simplifiant ainsi votre processus de gestion des données.
// Stocker une valeur dans l'instance Dragonfly avec une persistance.
Redis::transaction(function (Redis $redis) {
$redis->set('server-dynamic-configuration-key', '...');
$redis->command('STICK', 'server-dynamic-configuration-key');
});
// ...
// Retournera toujours une valeur car la clé ne peut pas être évincée.
$redis->get('server-dynamic-configuration-key');
Augmentation du débit dans la gestion des files d’attente
Dragonfly, tout comme Redis, est compétent pour gérer les files d’attente et les tâches. Comme vous l’avez probablement déjà deviné, la transition vers l’utilisation de Dragonfly à cet effet est transparente, n’exigeant aucune modification du code. Considérez l’exemple suivant en Laravel, où une tâche de traitement de podcasts est dépachée:
use App\Jobs\ProcessPodcast;
$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);
À la fois Dragonfly et Redis sont capables de gérer facilement des dizaines de milliers de tâches par seconde.
Pour ceux qui visent à maximiser les performances, il est important de noter que l’utilisation d’une seule file d’attente ne produira pas de gains de performance significatifs. Pour véritablement exploiter les capacités de Dragonfly, il convient d’utiliser plusieurs files d’attente. Cette approche répartit la charge sur plusieurs threads Dragonfly, augmentant ainsi le débit global.
Cependant, un défi commun se pose lorsque des clés provenant de la même file d’attente se retrouvent sur différents threads, ce qui entraîne une augmentation de la latence. Pour contrer cela, Dragonfly propose l’utilisation de hashtags dans les noms des files d’attente. Ces hashtags garantissent que les tâches dans la même file d’attente (qui utilise le même hashtag) sont automatiquement attribuées à des threads spécifiques, un peu comme dans un environnement de cluster Redis, réduisant ainsi la latence et optimisant les performances. Pour en savoir plus sur les hashtags, consultez le billet de blog sur l’exécution de BullMQ avec Dragonfly, qui contient une explication détaillée des hashtags et de leurs avantages, tandis que Dragonfly est utilisé comme magasin de support pour les systèmes de files d’attente de messages.
Pour un exemple rapide, pour optimiser la gestion de vos files d’attente avec Dragonfly, commencez par lancer Dragonfly avec des drapeaux spécifiques qui activent le verrouillage basé sur les hashtags et le mode de cluster simulé :
./dragonfly --lock_on_hashtags --cluster_mode=emulated
Une fois que Dragonfly est opérationnel avec ces paramètres, intégrez des hashtags dans les noms de vos files d’attente dans Laravel. Voici un exemple :
ProcessPodcast::dispatch($podcast)->onQueue('{podcast_queue}');
En utilisant des hashtags dans les noms de files d’attente, vous vous assurez que tous les messages appartenant à la même file d’attente sont traités par le même thread dans Dragonfly. Cette approche permet non seulement de conserver ensemble les messages liés, ce qui améliore l’efficacité, mais permet également à Dragonfly de maximiser le débit en distribuant différentes files d’attente sur plusieurs threads.
Cette méthode est particulièrement efficace pour les systèmes qui reposent sur Dragonfly en tant que magasin de messages de file d’attente, car elle exploite l’architecture multi-thread de Dragonfly pour gérer un volume plus important de messages de manière plus efficace.
Conclusion
La capacité de Dragonfly à gérer de lourds travaux avec une utilisation de mémoire réduite et son architecture multi-thread en font une option convaincante pour les applications web modernes. Tout au long de cet article, nous avons exploré comment Dragonfly s’intègre parfaitement avec Laravel, nécessitant un minimum de modifications de code, que ce soit pour le cache, la gestion des sessions ou la gestion des files d’attente.
Source:
https://dzone.com/articles/using-laravel-with-dragonfly