Go 言語と Redis を使用して API 電流制限を実装する方法
概要:
インターネットの急速な発展に伴い、API インターフェイスの使用も増加しています。一部の API インターフェイスでは、リクエストが多すぎるために過剰なシステム負荷が発生したり、麻痺が発生したりする場合があります。システムの安定性と信頼性を確保するには、API インターフェイスの電流フローを制限する必要があります。この記事では、Go 言語と Redis を使用して API 電流制限機能を実装する方法と、具体的なコード例を紹介します。
package main import ( "fmt" "github.com/go-redis/redis" "time" ) const ( MaxReqPerSec = 100 // 每秒最大请求数 ) func main() { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // 如果有密码,填入密码 DB: 0, // 默认数据库 }) // 初始化令牌桶 client.Set("bucket", MaxReqPerSec, 0) // 模拟请求 for i := 0; i < 1000; i++ { if allowed, err := checkAPIRequest(client); allowed { // 执行API请求 fmt.Println("API request allowed") // .... } else { fmt.Println("API request denied") // .... } time.Sleep(time.Millisecond * 100) } } func checkAPIRequest(client *redis.Client) (bool, error) { val, err := client.Decr("bucket").Result() if err != nil { return false, err } if val < 0 { client.Incr("bucket") return false, nil } return true, nil }
コードの説明:
関数では、まず Redis との接続を確立し、トークン バケットを初期化し、1 秒あたりの最大リクエスト数を 100 に設定します。
関数は、API リクエストが許可されているかどうかを確認するために使用されます。各リクエストでは、
client.Decr("bucket") オペレーションを通じてトークン バケットからトークンを取り出します。トークンの数が 0 未満の場合は、リクエストを実行できないことを意味し、トークンはバケットに追加して false を返す必要があります。トークンの数が 0 以上の場合、リクエストは許可され、true が返されます。
ファイルとして保存し、コマンド ラインを使用してファイルが存在するディレクトリを入力します。
go run main.go を実行してコードを実行します。プログラムは、各リクエスト間の間隔を 100 ミリ秒にして、100 個のリクエストをシミュレートします。設定されたリクエストの最大数に従って、最初の 100 リクエストは許可され、それ以降のリクエストは拒否されます。
この記事では、Go 言語と Redis を使用して API 電流制限機能を実装し、トークン バケット アルゴリズムを通じてリクエストされたトラフィックを制御する方法を紹介します。この方法を使用すると、大量のリクエストによる過負荷からシステムを効果的に保護し、システムの安定性と可用性を向上させることができます。
以上がGo言語とRedisを使用してAPI電流制限を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。