API Gateway 中的多层缓存应对高流量挑战
January 26, 2024
現代の開発においてAPIの使用が増え続ける中、効率的で信頼性の高いAPIゲートウェイの需要も高まっています。APIゲートウェイは、すべての受信APIリクエストの単一のエントリーポイントとして機能し、それらを効率的に管理し、さまざまなマイクロサービスに分散させることができます。APIゲートウェイは多くの利点を提供しますが、高トラフィックのシナリオでは課題に直面する可能性があります。
APISIXのキャッシュメカニズム
以下のフローチャートは、APISIXがレイテンシを最小限に抑え、パフォーマンスを向上させるために使用する効率的なキャッシュメカニズムを示しています。複数のレベルでレスポンスをキャッシュすることにより、APISIXは上流サーバーの負荷を効果的に軽減し、クライアントに対してより応答性の高い体験を提供できます。
Client <-- HTTP Request --> APISIX Worker
(Check LRU Cache in process level)
(No cache hit)
(Check Shared DICT Cache in data plane level)
(Lock not acquired)
(Acquire lock, check cache)
(Cache hit)
(Return cached response, release locks)
(Cache miss)
(Query Redis)
(Acquire Mutex)
(Query Redis)
(Cache miss)
(Retrieve response from upstream)
(Cache response in shared DICT cache)
(Return response to client)
(Cache hit)
(Copy response to shared DICT cache)
(Return cached response to client)
(Release Redis Mutex)
(Release lock)
(Cache hit)
(Return cached response)
LRU: APISIXシングルワーカーレベルでの第一層キャッシュ
APISIXのワーカーレベルにあるLRU(Least Recently Used)キャッシュは、各ワーキングプロセス内で頻繁にアクセスされるデータをキャッシュする重要なコンポーネントです。このキャッシュシステムはLRU削除アルゴリズムを採用し、データを効率的に保存および取得しながら、最も最近使用されていないデータの処理を優先します。頻繁にアクセスされるデータをメモリにキャッシュすることで、APISIXはルーティングルールや認証トークンなどの外部データソースをクエリする際のレイテンシとコストを大幅に削減し、システムの応答速度を向上させます。
このインテリジェントなキャッシュメカニズムにより、APISIXは大量のリクエストを処理する際にシステムリソースを効率的に活用し、システム全体のパフォーマンスと安定性を向上させます。APISIXは、高度なLRUキャッシュを備えており、開発者に信頼性の高い効率的なAPIゲートウェイソリューションを提供し、外部サービスとの円滑な通信を可能にします。
Shared Dict: APISIXノードレベルでの第二層キャッシュ
1つのAPISIXノード内のすべてのワーキングプロセス間で共有されるメモリ辞書(shared dict)キャッシュです。これは、APIのレスポンスデータやレスポンスヘッダーなどの一般的にアクセスされるデータの集中キャッシュとして機能します。複数のワーカープロセスが同時にこのキャッシュにアクセスし、更新することで、データの一貫性を確保し、不必要なデータの重複を避けます。
この共有メモリ辞書キャッシュは、メモリロックや効率的なデータ構造などの高度な技術を活用し、競合を最小限に抑え、スループットを最大化するという目標を達成します。メモリロックを通じて、複数のワーキングプロセス間での同時読み書き操作中の一貫性を確保します。効率的なデータ構造設計により、共有メモリ辞書キャッシュはデータの取得および更新操作をより迅速に実行し、全体的なパフォーマンスを向上させます。
共有メモリ辞書キャッシュの導入により、APISIXのデータプレーンにさらなるパフォーマンスとスケーラビリティが注入され、開発者に大規模なデータとリクエストを処理するための信頼性の高いツールを提供します。
APISIXの多層キャッシュメカニズム
以下の図は、APISIXの多層キャッシュメカニズムを示しており、漏斗の原理に似ています。具体的には、L1キャッシュはワーカー内のLRUキャッシュを利用し、L2キャッシュは複数のワーカー間で共有されるshared dict、L3キャッシュはAPIゲートウェイ外部のRedisデータベースです。
例を挙げて説明します:10,000のユーザーリクエストがAPISIXを通じてデータをクエリする場合、L1キャッシュのヒット率が90%と仮定すると、9000のリクエストが直接返されます。残りの1000のリクエストはL2キャッシュをクエリします。L2キャッシュのヒット率も90%と仮定すると、100のリクエストがL3キャッシュであるRedisをクエリします。これらの100のリクエストがRedisをクエリする前に、まずmutex(相互排他)をクエリし、一度に1つのリクエストのみがRedisをクエリするようにして、Dogpile Effectを防ぎます。
結論
多層キャッシュの機能を活用することで、APISIXはRedisやPostgresなどの外部データストレージコンポーネントに頻繁にクエリすることなく、クライアントリクエストの大部分を効率的に処理します。これにより、全体的なレイテンシが大幅に削減されるだけでなく、APIゲートウェイのスループットも向上し、ビジネスに効率的で堅牢なソリューションを提供し、外部サービスとの通信を簡素化します。最適化設計により、システムの堅牢性が確保され、APISIXは高並列シナリオに柔軟に対応し、エンジニアにとってより信頼性が高く高性能な開発環境を創出します。