Laravel gebruiken met Dragonfly

Dragonfly is een drop-in vervanging voor Redis die is ontworpen om veel betere prestaties te leveren met veel minder servers. Eén knooppunt kan miljoenen query’s per seconde verwerken en tot 1TB aan geheugengegevens opslaan. In dit artikel gaan we onderzoeken hoe je Dragonfly kunt gebruiken met Laravel, een van de meest gebruikte en bekende web frameworks.

Dragonfly behoudt volledige compatibiliteit met de Redis-interface, wat betekent dat Laravel-ontwikkelaars het als cache- en wachtrijbestuurder kunnen integreren zonder één regel code aan te passen. Deze soepele integratie kan een gemakkelijke upgrade route bieden met aanzienlijke voordelen.

Dus, of je nu een ervaren Laravel veteraan bent of net begint, sluit je aan bij ons terwijl we de wereld van Dragonfly en Laravel betreden.

Aan de slag

Laten we beginnen met het instellen van een nieuw Dragonfly-exemplaar. Bezoek onze documentatie hier om een afbeelding of de binaire bestanden te downloaden en snel een Dragonfly-exemplaar operationeel te krijgen. Zodra het Dragonfly-exemplaar operationeel en bereikbaar is, is de integratie met je Laravel-project een fluitje van een cent. Gelukkig heeft Laravel al volledige ondersteuning voor Redis, dus alle van zijn bestuurders kunnen opnieuw worden gebruikt. Om Dragonfly in je Laravel-toepassing te gebruiken, begin door het .env bestand bij te werken met de volgende configuraties.

Voor caching en sessiebeheer:

CACHE_DRIVER=redis
SESSION_DRIVER=redis

Om Dragonfly ook te integreren als de wachtrijbestuurder:

QUEUE_CONNECTION=redis

Hoewel we redis gebruiken als de driverwaarde, is Dragonfly ontworpen als een directe vervanging voor Redis, zodat geen extra driverinstallatie nodig is. Met de driver ingesteld, is de volgende stap om ervoor te zorgen dat Laravel met de Dragonfly-instantie kan communiceren. Dit betreft het bijwerken van het .env bestand opnieuw met de juiste verbindingsgegevens:

  • REDIS_HOST: De hostnaam of IP-adres van de Dragonfly-server.
  • REDIS_PORT: De poort waarop de Dragonfly-instantie draait.
  • REDIS_PASSWORD: Het wachtwoord voor de Dragonfly-instantie, indien ingesteld.

Hier is een voorbeeldconfiguratie:

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

Na het bijwerken van deze instellingen, controleer de verbinding door een eenvoudige bewerking uit te voeren zoals INFO in Laravel. Als je problemen ondervindt met de connectiviteit, controleer dan dubbel de host, poort en wachtwoordwaarden. Bovendien moet je ervoor zorgen dat de Dragonfly-server draait en toegankelijk is vanuit de omgeving van je Laravel-applicatie.

use Illuminate\Support\Facades\Redis;

// Voer de INFO-opdracht uit en print de Dragonfly-versie.
Redis::info()["dragonfly_version"];

Hogere efficiëntie als cache

Het in cache plaatsen van vaak geraadpleegde waarden is een van de belangrijkste toepassingen van geheugen-gebaseerde databases zoals Dragonfly en Redis vanwege hun snelle reactietijden. Dit is waar Dragonfly echt uitblinkt, vooral in scenario’s met een groot aantal sleutels en clients, typisch als centrale cache van multi-node systemen of 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.

Het activeren van de cachemodus is eenvoudig. Hier zijn de vlaggen die je zou gebruiken om Dragonfly in deze modus te draaien, met een geheugenlimiet van 12GB:

./dragonfly --cache_mode --maxmemory=12G

Overweeg een scenario waarin uw applicatie een grote hoeveelheid aanvragen moet afhandelen met een enorm gegevensbestand. In dergelijke gevallen kan de Dragonfly-cachemodus efficiënt geheugengebruik beheren terwijl snelle toegang tot gegevens wordt geboden, waardoor uw applicatie reageert en wendbaar blijft.

API-kant, alle functionaliteit van de Laravel Cache facade moet worden ondersteund. Als voorbeeld, om een bepaalde sleutel en waarde op te slaan met een specifieke vervaltijd, kan het volgende fragment worden gebruikt:

use Illuminate\Support\Facades\Cache;

// Sla een waarde op met een vervaltijd van 10 minuten.
Cache::put("key", "value", 600);

Geheugengebruik

Een van de voordelen van het gebruik van Dragonfly als cache is zijn meetbaar lagere geheugengebruik voor de meeste gebruiksgevallen. Laten we een eenvoudig experiment uitvoeren en zowel Redis als Dragonfly vullen met willekeurige tekststrings, en hun totale geheugengebruik meten nadat ze zijn gevuld met gegevens.

Dataset Dragonfly Redis
3 Million Values of Length 1000 2.75GB 3.17GB
15 Million Values of Length 200 3.8GB 4.6GB

Na het uitvoeren van het experiment hebben we waargenomen dat het geheugengebruik van Dragonfly tot 20% lager is vergeleken met Redis onder vergelijkbare omstandigheden. Dit stelt u in staat om aanzienlijk meer nuttige gegevens op te slaan met dezelfde geheugenvereisten, waardoor de cache efficiënter wordt en een hogere dekking behaalt. U kunt meer lezen over Dragonfly doorvoersnelheid benchmarks en geheugengebruik in de Redis vs. Dragonfly Scalability and Performance blog post.

Snapshotting

Naast lagere geheugengebruik, demonstreert Dragonfly ook stabiliteit tijdens snapshotprocedures. Snapshotten, vooral in drukke instanties, kan een uitdaging zijn wat betreft geheugenbeheer. Met Redis kan het maken van een snapshot op een zeer actieve instantie leiden tot een toename van het geheugengebruik. Dit gebeurt omdat Redis geheugenpagina’s moet kopiëren, zelfs diegenen die slechts gedeeltelijk zijn overschreven, resulterend in een piek in het geheugengebruik.

Dragonfly, in tegenstelling, past de volgorde van snapshotten aan op basis van binnenkomende aanvragen, effectief voorkomend dat er onverwachte pieken in het geheugengebruik optreden. Dit betekent dat zelfs tijdens intensieve operaties zoals snapshotten, Dragonfly een stabiel geheugenprofiel behoudt, waardoor consistente prestaties worden gegarandeerd zonder het risico op plotselinge geheugenpieken. U kunt meer lezen over het Dragonfly snapshotalgoritme in het blogbericht Balanced vs. Unbalanced.

Key Stickiness

Dragonfly introduceert ook een nieuw kenmerk met zijn aangepaste STICK opdracht. Deze opdracht is bijzonder handig in instanties die in cachemodus draaien. Het stelt specifieke sleutels in staat om als niet-uit te wisselen gemarkeerd te worden, ongeacht hun toegangsfrequentie.

Deze functionaliteit is vooral handig voor het opslaan van zelden geaccessioneerde, maar belangrijke gegevens. Je kunt bijvoorbeeld betrouwbaar hulpgegevens bewaren, zoals dynamische configuratiewaarden, rechtstreeks op je Dragonfly-exemplaar. Dit elimineert de noodzaak voor een apart datastore voor weinig gebruikte, maar cruciale gegevens, en verbetert je gegevensbeheerproces.

// Het opslaan van een waarde in het Dragonfly-exemplaar met kleverigheid.
Redis::transaction(function (Redis $redis) {
    $redis->set('server-dynamic-configuration-key', '...');
    $redis->command('STICK', 'server-dynamic-configuration-key');
});

// ...

// Zal altijd een waarde retourneren omdat de sleutel niet kan worden uitgesloten.
$redis->get('server-dynamic-configuration-key');

Verbetering van doorvoer bij wachtrijbeheer

Dragonfly, net als Redis, is uitstekend in het beheren van wachtrijen en taken. Zoals je misschien al hebt geraden, is de overgang naar het gebruik van Dragonfly voor deze doeleinden soepel en vereist geen codewijzigingen. Overweeg het volgende voorbeeld in Laravel, waarbij een podcastverwerkingsjob wordt geactiveerd:

use App\Jobs\ProcessPodcast;

$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);

Zowel Dragonfly als Redis zijn in staat om gemakkelijk tienduizenden taken per seconde te verwerken.

Voor degenen die prestaties willen maximaliseren, is het belangrijk op te merken dat het gebruik van één jobwachtrij geen significante prestatiewinst oplevert. Om echt gebruik te maken van de mogelijkheden van Dragonfly, moeten meerdere wachtrijen worden gebruikt. Deze aanpak verdeelt de belasting over meerdere Dragonfly-threads, waardoor de totale doorvoer wordt verbeterd.

Echter, ontstaat er een veelvoorkomend probleem wanneer sleutels uit dezelfde wachtrij op verschillende threads terechtkomen, wat leidt tot verhoogde latentie. Om dit tegen te gaan, biedt Dragonfly de mogelijkheid om hashtags in wachtrijnamen te gebruiken. Deze hashtags zorgen ervoor dat taken in dezelfde wachtrij (die dezelfde hashtag gebruikt) automatisch worden toegewezen aan specifieke threads, vergelijkbaar met een Redis Cluster-omgeving, waardoor latentie wordt verminderd en prestaties worden geoptimaliseerd. Wilt u meer weten over hashtags? Bekijk dan de blogpost over het gebruik van BullMQ met Dragonfly, die een gedetailleerde uitleg geeft over hashtags en hun voordelen, terwijl Dragonfly wordt gebruikt als ondersteunende opslag voor berichtenwachtsysteem.

Als een snel voorbeeld, om uw wachtrijbeheer met Dragonfly te optimaliseren, start u door Dragonfly te starten met specifieke vlaggen die hashtag-gebaseerd vergrendelen en gesimuleerde cluster-modus inschakelen:

./dragonfly --lock_on_hashtags --cluster_mode=emulated

Zodra Dragonfly met deze instellingen draait, incorporeer hashtags in uw wachtrijnamen in Laravel. Hier is een voorbeeld:

ProcessPodcast::dispatch($podcast)->onQueue('{podcast_queue}');

Door hashtags in wachtrijnamen te gebruiken, zorgt u ervoor dat alle berichten die tot dezelfde wachtrij behoren, door dezelfde thread in Dragonfly worden verwerkt. Deze aanpak houdt niet alleen gerelateerde berichten bij elkaar, wat de efficiëntie verhoogt, maar stelt Dragonfly ook in staat om de doorvoer te maximaliseren door verschillende wachtrijen over meerdere threads te verdelen.

Deze methode is met name effectief voor systemen die Dragonfly gebruiken als een berichtenwachtrij achtergelegen bewaarplaats, aangezien het Dragonfly’s multithreadarchitectuur inzet om een hogere volume berichten efficiënter te verwerken.

Conclusie

Dragonfly’s vermogen om enorme workloads te verwerken met lagere geheugengebruik en zijn multithreadarchitectuur maken het een aantrekkelijk keuze voor moderne webapplicaties. In dit artikel hebben we onderzocht hoe Dragonfly soepel integreert met Laravel, met minimale tot geen codewijzigingen vereist, hetzij voor caching, sessiebeheer of wachtrijbeheer.

Source:
https://dzone.com/articles/using-laravel-with-dragonfly