goroutine やチャネルなどの Go の同時実行プリミティブを使用すると、大規模な同時リクエストを効率的に処理できます。固定数の goroutine を作成し、チャネルを使用してリクエストをバッファします。ロックまたはミューテックスを使用して共有リソースを保護します。コンテキストを使用してタイムアウトを設定するなどして、同時リクエストの数を制限します。
Go で大規模な同時リクエストを効率的に処理する
はじめに
大規模な同時リクエストの処理は、特にマイクロサービスや Web アプリケーションにおいて共通の課題です。 Go は同時実行のために構築された言語であり、そのようなワークロードの処理に特に適しています。この記事では、Go の同時実行のプリミティブとベスト プラクティスを紹介し、実際のケースを使用して大規模な同時リクエストを効率的に処理する方法を示します。
Goroutine と Channel
Goroutine は、スレッドに似た、Go の軽量の並列実行ユニットです。チャネルは、ゴルーチン間の通信のためのメカニズムです。
ベストプラクティス
実践例
ユーザーがアップロードしたファイルを処理する Web アプリケーションを作成します。アプリケーションは、複数のファイルのアップロード要求を同時に処理する必要があります。
package main import ( "context" "log" "net/http" "sync" ) const maxConcurrency = 10 var wg sync.WaitGroup func main() { http.HandleFunc("/upload", uploadHandler) http.ListenAndServe(":8080", nil) } func uploadHandler(w http.ResponseWriter, r *http.Request) { wg.Add(1) defer wg.Done() // 创建一个 goroutine 来处理文件上传 go func() { defer r.Body.Close() if err := handleFileUpload(r.Body); err != nil { log.Println(err) } }() // 限制并发上传的数量 ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() select { case <-ctx.Done(): http.Error(w, "Too many concurrent uploads", http.StatusTooManyRequests) return default: } } func handleFileUpload(r io.Reader) error { // 省略实际的文件上传处理 return nil }
結論
この記事で紹介されているベスト プラクティスに従うことで、大規模な同時リクエストを処理できる効率的でスケーラブルな Go アプリケーションを構築できます。
以上がGo を使用して大規模な同時リクエストを効率的に処理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。