Dragonflyは、より少ないサーバーで大幅に優れたパフォーマンスを提供するためのRedisのドロップイン置換です。単一ノードで1秒間に数百万のクエリを処理し、最大1TBのメモリ内データを扱うことができます。この記事では、最も広く使用されており、よく知られたWebフレームワークの一つであるLaravelでDragonflyを使用する方法を探ります。
DragonflyはRedisインターフェースと完全互換性を維持しており、Laravel開発者はキャッシュおよびキューのドライバーとして1行のコード変更なしで統合できます。このシームレスな統合は、大きな利点をもたらす容易なアップグレード経路を提供します。
そう、あなたが熟練したLaravelのベテランであろうと、始めての方であろうと、DragonflyとLaravelの世界に足を踏み入れるために我々と共に参加してください。
スタートアップ
まず、新しいDragonflyインスタンスを設定することから始めましょう。ドキュメントにアクセスしてイメージやバイナリをダウンロードし、すぐにDragonflyインスタンスを稼働させることができます。こちら Dragonflyインスタンスが稼働し、アクセス可能になったら、Laravelプロジェクトとの統合は簡単です。幸いなことに、LaravelはすでにRedisを完全にサポートしているので、そのすべてのドライバーを再利用できます。LaravelアプリケーションでDragonflyを使用するには、次の構成で.env
ファイルを更新することから始めます。
キャッシングおよびセッション管理のために:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
キュードライバーとしてDragonflyを統合するために:
QUEUE_CONNECTION=redis
ドライバー値としてredis
を使用していますが、DragonflyはRedisの直接的な置き換えとして設計されているため、追加のドライバーインストールは必要ありません。ドライバーが設定されたら、次のステップはLaravelがDragonflyインスタンスと通信できるようにすることです。これには、正しい接続詳細で.env
ファイルを再度更新することが含まれます:
REDIS_HOST
: Dragonflyサーバーのホスト名またはIPアドレス。REDIS_PORT
: Dragonflyインスタンスが実行されているポート。REDIS_PASSWORD
: 設定されている場合のDragonflyインスタンスのパスワード。
以下は設定例です:
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
これらの設定を更新した後、LaravelでINFO
のような単純な操作を実行して接続を確認してください。接続に問題があれば、ホスト、ポート、パスワードの値を再確認してください。また、Dragonflyサーバーが実行中で、Laravelアプリケーションの環境からアクセス可能であることを確認してください。
use Illuminate\Support\Facades\Redis;
// INFOコマンドを実行してDragonflyのバージョンを表示します。
Redis::info()["dragonfly_version"];
キャッシュとしてのより高い効率
頻繁にアクセスされる値をキャッシュすることは、DragonflyやRedisのようなインメモリデータベースの主な用途の一つであり、その高速な応答時間のためです。これはDragonflyが特に輝く場面で、多数のキーとクライアントを持つシナリオ、例えばマルチノードシステムやマイクロサービスの中央キャッシュで典型的です。
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.
キャッシュモードをアクティブにするのは簡単です。これらのフラグを使用して、12GBのメモリキャップでDragonflyをこのモードで実行する方法です:
./dragonfly --cache_mode --maxmemory=12G
アプリケーションが大量のリクエストと膨大なデータセットを処理する必要があるシナリオを考えてみましょう。このような場合、Dragonflyキャッシュモードはメモリ使用量を効率的に管理し、データへの迅速なアクセスを提供します。これにより、アプリケーションは反応性と敏捷性を維持します。
APIの観点から、Laravel Cacheファサードのすべての機能がサポートされている必要があります。たとえば、特定の有効期限時間でキーと値を保存するには、次のスニペットを使用できます。
use Illuminate\Support\Facades\Cache;
// 10分の有効期限で値を保存します。
Cache::put("key", "value", 600);
メモリ使用量
Dragonflyをキャッシュとして使用する利点の1つは、ほとんどのユースケースで計測可能な低いメモリ使用量です。簡単な実験を行い、RedisとDragonflyの両方にランダムな文字列を詰め込み、データを詰め込んだ後の合計メモリ使用量を測定してみましょう。
Dataset | Dragonfly | Redis |
---|---|---|
3 Million Values of Length 1000 | 2.75GB | 3.17GB |
15 Million Values of Length 200 | 3.8GB | 4.6GB |
実験を行った結果、同様の条件下でRedisと比較してDragonflyのメモリ使用量が最大20%低いことが観察されました。これにより、同じメモリ要件ではるかに多くの有用なデータを保存できるため、キャッシュはより効率的になり、カバレッジが高まります。Dragonflyのスループットベンチマークやメモリ使用量については、Redis vs. Dragonflyのスケーラビリティとパフォーマンスに関するブログ記事で詳しく読むことができます。
スナップショット
メモリ使用量の低減以上に、Dragonflyはスナップショット作成プロセス中の安定性も示しています。スナップショット作成は、特にビジー状態のインスタンスでは、メモリ管理の観点から課題となります。Redisを使用する場合、非常にアクティブなインスタンスでスナップショットを取得すると、メモリ使用量が増加する可能性があります。これは、Redisがメモリページをコピーする必要があり、部分的にしか書き換えられていないページであっても、メモリ使用量の急増を引き起こすためです。
一方、Dragonflyは、受け入れられたリクエストに基づいてスナップショット作成の順序を調整し、予期しないメモリ使用量の急増を効果的に防ぎます。これは、スナップショット作成のような強力な操作中であっても、Dragonflyが安定したメモリフットプリントを維持し、急なメモリの急増なしで一貫したパフォーマンスを保証することを意味します。Dragonflyのスナップショットアルゴリズムについては、「バランスの取れた vs. バランスの取れていない」ブログ記事でさらに読むことができます。
キーの粘着性
Dragonflyはまた、独自のSTICK
コマンドで新機能も導入しています。このコマンドは、キャッシュモードで実行されているインスタンスに特に役立ちます。アクセス頻度に関係なく、特定のキーを非エヴィクティングとしてマークできるようになります。
この機能は、アクセス頻度が低くても重要なデータを保存するのに特に便利です。例えば、動的な設定値のような補助情報を、Dragonflyインスタンス上に直接確実に保持できます。これにより、頻繁に使用されないが重要なデータのための別のデータストアが不要になり、データ管理プロセスを合理化します。
// Dragonflyインスタンスに値を保存し、粘着性を持たせる。
Redis::transaction(function (Redis $redis) {
$redis->set('server-dynamic-configuration-key', '...');
$redis->command('STICK', 'server-dynamic-configuration-key');
});
// ...
// キーが削除されない限り常に値を返す。
$redis->get('server-dynamic-configuration-key');
キュー管理におけるスループットの向上
DragonflyはRedisと同様に、キューとジョブの管理に長けています。既に推測されたかもしれませんが、この目的でDragonflyを使用する移行はコード変更を必要とせず、スムーズです。Laravelでのポッドキャスト処理ジョブがディスパッチされる次の例を考えてみましょう。
use App\Jobs\ProcessPodcast;
$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);
DragonflyもRedisも、1秒あたり数万のジョブを容易に処理できます。
パフォーマンスを最大化しようとする場合、単一のジョブキューを使用しても大幅なパフォーマンス向上は見られないことに注意してください。Dragonflyの能力を本当に活用するためには、複数のキューを使用するべきです。このアプローチは、複数のDragonflyスレッドに負荷を分散させ、全体的なスループットを向上させます。
しかし、同じキューからのキーが異なるスレッドに配置されると、遅延が増加するという一般的な課題が生じます。これに対処するために、Dragonflyはキュー名にハッシュタグを使用する機能を提供しています。これらのハッシュタグにより、同じハッシュタグを使用する同じキュー内のジョブが特定のスレッドに自動的に割り当てられるため、Redis Cluster環境のように遅延を減らし、パフォーマンスを最適化できます。ハッシュタグについて詳しく知りたい方は、Dragonflyをバッキングストアとして使用したBullMQの実行に関するブログ記事をチェックしてください。この記事では、ハッシュタグとその利点について詳細に説明されています。
簡単な例として、Dragonflyでキュー管理を最適化するために、ハッシュタグベースのロックとエミュレートされたクラスタモードを有効にする特定のフラグでDragonflyを起動します。
./dragonfly --lock_on_hashtags --cluster_mode=emulated
これらの設定でDragonflyを実行したら、Laravelのキュー名にハッシュタグを組み込みます。例を示します。
ProcessPodcast::dispatch($podcast)->onQueue('{podcast_queue}');
キュー名にハッシュタグを使用することで、同じキューに属するすべてのメッセージがDragonflyの同じスレッドで処理されることが保証されます。このアプローチは、関連するメッセージをまとめて効率を高めるだけでなく、異なるキューを複数のスレッドに分散させることでDragonflyがスループットを最大化できるようにします。
この方法は、メッセージキューのバッキングストアとしてドラゴンフライに依存するシステムに特に効果的です。ドラゴンフライのマルチスレッドアーキテクチャを活用して、より多くのメッセージをより効率的に処理できるからです。
結論
ドラゴンフライの巨大なワークロードを低いメモリ使用量で処理できる能力と、マルチスレッドアーキテクチャは、現代のウェブアプリケーションにとって魅力的な選択肢となります。この記事全体を通じて、ドラゴンフライがキャッシング、セッション管理、キュー管理などの目的で、最小限のコード変更を必要とせずに、Laravelとどのようにシームレスに統合されるかを探りました。
Source:
https://dzone.com/articles/using-laravel-with-dragonfly