ホームページ  >  記事  >  バックエンド開発  >  golang ロングポーリングの実装

golang ロングポーリングの実装

WBOY
WBOYオリジナル
2023-05-15 09:01:06823ブラウズ

Web アプリケーションの高度な発展により、ソーシャル ネットワークやチャット アプリケーションは現代の生活に欠かせないものになりました。これらのアプリケーションはリアルタイム通信テクノロジーを使用しており、ユーザーからのリアルタイムのフィードバックと情報更新を維持するために、信頼性が高く効率的なメッセージ プッシュ システムが必要です。 Golang の出現により、リアルタイム通信テクノロジのより優れたソリューションが提供されます。最も重要なテクノロジはロング ポーリングです。

ロングポーリングは、Web アプリケーションおよびサーバー向けのリアルタイム メッセージング テクノロジであり、低遅延と高信頼性という特徴があります。クライアント/サーバー アーキテクチャや REST (Representational State Transfer) API などの従来のアプリケーションでは、クライアントは通常、サーバーを定期的にポーリングすることによって更新されたデータを取得します。ただし、この方法では、特に同時実行性が高い状況ではサーバーの負荷が大幅に増加し、各クライアントが常にサーバーをポーリングしているため、サーバーには大きな負荷がかかります。ロングポーリングテクノロジーは、この問題を効果的に解決できます。

ロング ポーリング テクノロジの実装原理は、クライアントがサーバーにリクエストを送信し、サーバーがリクエストを受信した後、新しいデータが更新されるまで一定期間待機し、その後クライアントのリクエストに応答するというものです。 、リクエストをレスポンスで返し、最新のデータをクライアントに渡します。従来のショートポーリング方式のように頻繁に接続を要求したり閉じたりする必要がなく、クライアントとサーバー間の接続が常に維持されるため、サーバーへの同時接続数と帯域幅の使用量が効果的に削減されます。

ここで、Golang を使用してロング ポーリング テクノロジを実装する方法を簡単に理解しましょう。

まず、サーバー側にロングポーリング応答ロジックを実装する必要があります。 Golang では、これは標準ライブラリの「net/http」パッケージと「time」パッケージを使用して実現できます。サーバーは最初にクライアントからリクエストを受信し、次に「time.After」メソッドを使用して一定時間待機します。ここでは待機時間を 10 秒に設定します。待ち時間内に新しいデータ更新があった場合は最新データをレスポンスで返しますが、それ以外の場合は空のレスポンスを返します。コードは次のとおりです。

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/poll", func(w http.ResponseWriter, r *http.Request) {
        <-time.After(10 * time.Second)
        fmt.Fprintf(w, "Hello, world!")
    })

    http.ListenAndServe(":8080", nil)
}

次に、クライアントにロング ポーリング呼び出しロジックを実装する必要があります。 Golang では、「net/http」パッケージと「io/ioutil」パッケージを使用して HTTP リクエストを送信できます。クライアントは、HTTP リクエストを送信してサーバーの応答を待つ無限ループを作成する可能性があります。各応答で、サーバーから返されたデータを出力し、リクエストを再送信できます。コードは次のとおりです。

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    for {
        res, err := http.Get("http://localhost:8080/poll")
        if err != nil {
            fmt.Println(err)
            continue
        }
        defer res.Body.Close()

        body, err := ioutil.ReadAll(res.Body)
        if err != nil {
            fmt.Println(err)
            continue
        }

        fmt.Println(string(body))
    }
}

ロング ポーリングの実装にはまだいくつかの問題があることに注意してください。通常、このリクエストを受信して​​からレスポンスが返されるまでの間に、ネットワークの遅延などの理由により、リクエストとレスポンスの時間差が非常に大きくなる場合があります。長時間待機する必要がある場合、次の問題に直面する可能性があります:

1. クライアントは待機時間中アイドル状態になるため、ループでリクエストを送信する必要があり、帯域幅とサーバー リソースを使い果たします。

2. 多数のクライアントが同時に同じメソッドをリクエストすると、サーバーは混乱に陥り、多数の保留中のリクエストを処理できなくなります。

3. ポーリング期間が長いと、「ネットワーク障害」や「突然のシャットダウン」などの理由でクライアントが自動的に切断される場合があります。

これらの問題を解決するには、WebSocket や SSE (Server-sent Events) などのテクノロジを使用して、ロング ポーリングの実装をさらに改善できます。ただし、これはこの記事の焦点では​​ないため、関連情報や文献を参照することで、さらに詳しく知ることができます。

まとめでは、Golang でロングポーリング技術を実装する具体的な方法について学び、ロングポーリング技術の原理と重要性についても理解しました。現在の Web アプリケーションの高度な発展に伴い、ロング ポーリング テクノロジはますます広く使用され、リアルタイム通信テクノロジの主要な方法の 1 つになると考えられます。

以上がgolang ロングポーリングの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。