WebSocket は、最新のリアルタイム Web アプリケーション開発において非常に人気のあるプロトコルになっています。 WebSocket を使用してアプリケーションを作成する場合、アプリケーションがクライアントのリクエストに迅速かつ正確に応答できるように、パフォーマンスの最適化を考慮する必要があります。この記事では、Go WebSocket アプリケーションのパフォーマンスを最適化する方法について説明し、具体的なコード例を示します。
Go 言語には、Gorilla WebSocket、Gobwas WebSocket、Fasthttp WebSocket など、いくつかの人気のある WebSocket ライブラリから選択できます。その中でも、Gorilla WebSocket ライブラリは最も広く使用されているライブラリの 1 つであり、他のライブラリよりも多くの機能を提供します。 WebSocket ライブラリを選択するときは、そのパフォーマンス、機能、使いやすさを考慮する必要があります。
この記事では、Gorilla WebSocket ライブラリを使用してデモを行います。
WebSocket アプリケーションを設計するときは、不要な接続をできる限り回避する必要があります。各 WebSocket 接続はサーバー リソースを消費するため、1 つの接続で完了できる操作が、接続が計画されていないために複数の接続になる場合、サーバーは過負荷になります。新しい接続を確立する負担を避けるために、必要に応じて接続を作成し、存続期間の長い接続をできるだけ頻繁に使用することをお勧めします。
Gorilla WebSocket ライブラリを使用して WebSocket 接続を作成するサンプル コードを見てみましょう:
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func main() { http.HandleFunc("/ws", handleWebSocket) log.Fatal(http.ListenAndServe(":8080", nil)) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close() // use the websocket connection here }
上記のサンプル コードでは、WebSocket 接続を処理する handleWebSocket 関数を作成しました。この関数では、upgrader.Upgrade() 関数を使用して、HTTP 接続を WebSocket 接続にアップグレードします。ここでは defer conn.Close() 関数を使用して、WebSocket 接続が関数の最後に確実に閉じられるようにしていることに注意してください。
接続数が一定のレベルに達した場合、WebSocket 構成の負荷分散が非常に重要になります。サーバーの場合、WebSocket には、ReadBufferSize と WriteBufferSize という特に重要な 2 つの構成パラメータがあります。これら 2 つのパラメータは、WebSocket 接続の読み取りバッファと書き込みバッファのサイズを制御します。バッファーが大きすぎると接続パフォーマンスに影響する可能性があり、バッファーが小さすぎると追加のデータ転送の数が増加する可能性があります。
Gorilla WebSocket ライブラリを使用する場合、次の方法でバッファのサイズを変更できます。
var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, }
上記のコード例では、ReadBufferSize と WriteBufferSize のサイズを 1024 バイトに設定しています。実際のニーズに応じて適切なサイズを設定してください。
WebSocket アプリケーションは多数の同時接続をサポートする必要があるため、各接続を処理するために goroutine を使用する必要があります。 Go 言語の標準ライブラリが提供する goroutine メカニズムを使用して、複数の WebSocket 接続を処理できます。作成した WebSocket 接続をゴルーチンに渡すだけで、各接続が簡単に処理されます。
以下は、WebSocket 接続の同時処理を使用するサンプル コードです。
func main() { http.HandleFunc("/ws", handleWebSocket) log.Fatal(http.ListenAndServe(":8080", nil)) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } go func(conn *websocket.Conn) { for { _, message, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Printf("received message: %s", message) // handle the message here } }(conn) }
上記のサンプル コードでは、各 WebSocket 接続を処理するために goroutine を使用します。各ゴルーチンでは、conn.ReadMessage() 関数を使用して WebSocket メッセージを受信します。その後、各ゴルーチンでメッセージを処理できます。
WebSocket 接続ごとに作成されるバッファは大量のメモリを消費します。したがって、メモリ使用率を最大化する必要があります。以下にいくつかの提案を示します。
たとえば、次の例は、メッセージをキャッシュし、定期的にキャッシュを消去する方法を示しています。
type Connection struct { conn *websocket.Conn send chan []byte } func (c *Connection) read() { for { _, _, err := c.conn.ReadMessage() if err != nil { break } } c.conn.Close() } func (c *Connection) write() { ticker := time.NewTicker(10 * time.Second) defer func() { ticker.Stop() c.conn.Close() }() var messages [][]byte for { select { case message, ok := <-c.send: if !ok { c.conn.WriteMessage(websocket.CloseMessage, []byte{}) return } messages = append(messages, message) case <-ticker.C: if err := c.conn.WriteMessage(websocket.TextMessage, bytes.Join(messages, []byte{})); err != nil { return } messages = nil } } } func main() { http.HandleFunc("/ws", handleWebSocket) log.Fatal(http.ListenAndServe(":8080", nil)) } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } connection := &Connection{conn: conn, send: make(chan []byte, 256)} go connection.write() go connection.read() // use the connection here }
上記のサンプル コードでは、conn と send Two を含む Connection 構造を作成しました。田畑。送信フィールドは、すべてのメッセージがバッファリングされるバッファを持つチャネルです。次に、ティッカーを使用してメッセージを定期的にクリアして送信します。
概要:
Go 言語で WebSocket アプリケーションのパフォーマンスを最適化するには、次の点を考慮する必要があります:
上記は、 Go 言語 WebSocket アプリケーションのパフォーマンスを最適化する 最も効果的な方法のいくつか。この記事のサンプル コードは包括的なものではありませんが、WebSocket アプリケーションを開発する際には、アプリケーションのパフォーマンスを向上させるために上記の推奨事項に従う必要があります。
以上がGo 言語 Websocket アプリケーションのパフォーマンスを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。