解码微服务高可用性:使用Apache APISIX探索API治理策略
March 29, 2024
はじめに
マイクロサービスアーキテクチャは、現在のITアーキテクチャの主流となっています。その柔軟性と拡張性により、企業は急速に変化するビジネス要件に対応しやすくなっています。しかし、マイクロサービスの高可用性を確保することが、アーキテクチャ設計における重要な課題となっています。この文脈において、APIサービスガバナンスの3つの核心戦略 — レートリミット、サーキットブレーカー、およびデグレード — は特に重要です。
マイクロサービスアーキテクチャにおける基本的な基盤コンポーネントとして、APIゲートウェイはサービスガバナンスにおいて重要な役割を果たします。Apache APISIXは、次世代のクラウドネイティブAPIゲートウェイとして、高いパフォーマンスとセキュリティ機能を備えているだけでなく、豊富なトラフィック管理機能も提供しています。以下の議論では、APIサービスガバナンスの「三本柱」について詳しく掘り下げ、これらの戦略をAPISIXでどのように適用してサービスの高可用性を確保するかについて詳しく説明します。
APIガバナンス戦略
レートリミット
レートリミットは、その名の通り、トラフィックに対する制限メカニズムです。その核心的な原理は、過剰なトラフィックによるシステムの過負荷やクラッシュを防ぐことにあります。基本的な概念は、特定の時間間隔内のリクエスト量を規制し、特定の制約を満たすリクエストのみがシステムにアクセスできるようにすることで、マイクロサービスおよびシステム全体の安定した動作を確保することです。現実のシナリオでも、レートリミットの概念は見られます。例えば、地下鉄駅のピーク時には、セキュリティチェックのために複数のゲートが設置され、順序正しくスムーズな列を誘導します。
レートリミットは、以下のようなさまざまな方法で実装できます:
-
リクエスト数に基づく: 各時間帯内のリクエスト数を追跡し、特定の閾値内に制限します。例えば、1秒あたり最大100リクエストを処理します。
-
リクエスト頻度に基づく: クライアントまたはIPアドレスごとのリクエスト頻度を制限し、過剰なリクエストを防ぎます。例えば、1分あたり最大10リクエストを許可します。
-
接続数に基づく: 同時接続数を制限し、システムリソースの過剰消費を防ぎます。例えば、最大100の同時接続を許可します。
異なるレートリミット戦略により、さまざまなシナリオ要件に対応できます。例えば、価値のあるAPIリソースに対して、1分あたり10リクエストに制限することができます。または、サービスの可用性を向上させるために、同時リクエスト数を制限してサービスの応答時間を短縮するなど、さまざまなシナリオがあります。これらのレートリミット戦略を適切に実装することで、高並列性や突然のトラフィック急増下でもサービスの正常な動作を確保できます。
サーキットブレーカー
マイクロサービスアーキテクチャでは、サービスが相互に呼び出し合う状況が発生する可能性があります。1つのサービスが失敗すると、他のサービスに影響を与え、最終的にはシステム全体の崩壊を引き起こす可能性があります。この現象は「連鎖的失敗」または「アバランシェ効果」と呼ばれます。サーキットブレーカーメカニズムは、マイクロサービスにおける連鎖的失敗に対する保護策として、失敗の拡散を防ぐために使用されます。マイクロサービスが異常や遅延を起こすと、サーキットブレーカーが迅速にトリガーされ、そのサービスへのリクエストを一時的にブロックし、システム全体の安定性を確保します。
サーキットブレーカーメカニズムの核心的な原理は、サービスの応答時間やエラーレートをリアルタイムで監視することにあります。これらのメトリクスが事前に設定された閾値を超えると、サーキットブレーカーが自動的にトリガーされ、障害が発生したサービスへのリクエストを迅速に停止します。サービスが正常に戻ると、サーキットブレーカーは自動的に閉じ、サービスへのアクセスを再開します。このメカニズムは、電気回路の抵抗器に似ています。電圧が許容範囲を超えると、抵抗器は自動的に回路を切断し、過剰な電流が他の電子部品を損傷するのを防ぎます。回路を検査・修理した後、抵抗器は再び閉じ、回路は正常に動作します。
サーキットブレーカーメカニズムを導入することで、マイクロサービスアーキテクチャは、相互サービス呼び出しによる潜在的な連鎖的失敗の問題により適切に対処でき、特に高負荷シナリオ下でのシステムの安定性と信頼性を確保できます。
デグレード
デグレードは、システムの高負荷に対処するための効果的な戦略であり、一部の非必須機能を一時的に無効化したり、特定のサービスの品質を適度に低下させたりして、システム全体の安定した動作を確保します。マイクロサービスアーキテクチャでは、デグレードメカニズムを適用することで、一部の非コア機能や一時的に不要な機能をインテリジェントに遮蔽し、コア機能の継続的かつ安定した動作を確保できます。例えば、ビデオ会議アプリケーションでは、ネットワーク帯域幅が制限されている場合、ビデオの送信品質を低下させたり、ビデオ機能を一時的に無効化したりして、音声通話の明瞭さと安定性を確保し、会議の基本的なコミュニケーションニーズを満たすことができます。
一般的な戦略には以下があります:
-
機能デグレード: 一部の機能を一時的に閉じたり、アクセスを制限したりして、コアサービスの正常な動作を確保します。例えば、ソーシャルメディアアプリケーションでは、ピーク時に「いいね」や「コメント」機能を一時的に無効化し、ユーザーがコンテンツを正常に閲覧できるようにします。
-
品質デグレード: システムの高負荷時に、特定のサービスや機能の品質要件を低下させます。例えば、前述のように、ビデオの解像度やフレームレートを低下させて、スムーズなコミュニケーションを確保します。
APISIXにおけるレートリミット、サーキットブレーカー、デグレード
APISIXで有効化された前述の3つの主要戦略を活用して、マイクロサービスの高可用性をどのように向上させることができるでしょうか?以下に、いくつかの一般的な応用例を示します。
limit-count
プラグインによるレートリミット
APISIXは、limit-count
、limit-req
、limit-conn
などのさまざまな組み込みトラフィック管理プラグインを提供しています。実際のニーズに応じて、適切な方法を選択してトラフィック制御を行うことができます。limit-count
プラグインを例にとると、特定の時間間隔内のリクエスト総数を制限し、HTTPヘッダーに残りのリクエスト数を返します。
curl -i http://127.0.0.1:9080/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/get",
"plugins": {
"limit-count": {
"count": 3,
"time_window": 60,
"rejected_code": 429,
"key_type": "var",
"key": "remote_addr"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
api-breaker
プラグインによるサーキットブレーカー
APISIXのapi-breaker
プラグインは、事前に設定された閾値に基づいてサーキットブレーカーメカニズムを自動的にトリガーし、連鎖的失敗を防ぎます。例えば、アップストリームサービスが3回連続で500または503ステータスコードを返すと、サーキットブレーカーが作動し、200ステータスコードが返されるとアクセスを再開します。
curl "http://127.0.0.1:9180/apisix/admin/routes/1" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"api-breaker": {
"break_response_code": 502,
"unhealthy": {
"http_statuses": [500, 503],
"failures": 3
},
"healthy": {
"http_statuses": [200],
"successes": 1
}
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"uri": "/get",
}'
fault-injection
プラグインによるデグレード
APISIXのfault-injection
およびmocking
プラグインは、システムの高負荷時に一部の機能を一時的に無効化したり、事前に設定されたデータを直接返したりするデグレード戦略をサポートし、システムの安定性を確保します。例えば、fault-injection
プラグインは、指定されたHTTPステータスコードとボディ値をクライアントに直接返すことができます。
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"fault-injection": {
"abort": {
"http_status": 200,
"body": "Fault Injection!"
}
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
},
"uri": "/get"
}'
結論
レートリミット、サーキットブレーカー、デグレードは、マイクロサービスアーキテクチャにおける重要なサービスガバナンス策であり、マイクロサービスの高可用性を向上させる上で不可欠な役割を果たします。これらは、マイクロサービスアーキテクチャをさまざまな潜在的なリスクや課題から守る堅固な盾として機能します。多様なビジネスシナリオに直面した際には、これらの対策を柔軟かつ慎重に適用し、マイクロサービスアーキテクチャの安定性と信頼性が最適に保護されるようにする必要があります。