ホームページ  >  記事  >  バックエンド開発  >  ロングポーリングを使用した gRPC サーバーからクライアントへのブロードキャストを実装するにはどうすればよいですか?

ロングポーリングを使用した gRPC サーバーからクライアントへのブロードキャストを実装するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 20:06:02686ブラウズ

How to Implement gRPC Server-to-Client Broadcasting with Long-Polling?

gRPC サーバーからクライアントへのブロードキャスト

gRPC では、サーバーから接続されている複数のクライアントにイベントをブロードキャストするときに共通の課題が発生します。提示された質問では、ストリームを使用してこれを実現する方法、特に誰が接続しているのか、各クライアントにどのようにアドレス指定するかをサーバーが認識している場合のガイダンスを求めています。

ロングポーリングアプローチを利用する

ストリームの代替ソリューションは、ロングポーリングアプローチを実装することです。この手法では、クライアントがサーバーに継続的にリクエストを送信し、接続を維持します。サーバー上でイベントが発生すると、待機中のすべてのクライアントに通知し、リクエストを終了して新しいリクエストを作成するように求めます。

ロングポーリングのコードサンプル

以下コード サンプルは、Python でロング ポーリングを実装する方法を示しています。

.PROTO 定義

<code class=".PROTO">service Updater {
    rpc GetUpdates(GetUpdatesRequest) returns (GetUpdatesResponse);
}

message GetUpdatesRequest {
    int64 last_received_update = 1;
}

message GetUpdatesResponse {
    repeated Update updates = 1;
    int64 update_index = 2;
}

message Update {
    // Your update structure
}</code>

サーバー コード

<code class="python">class UpdaterServer(UpdaterServicer):
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            # Remove old updates after some time
            self.updates.append(updates)
            self.condition.notify_all()

    def GetUpdates(self, req, context):
        with self.condition:
            while self.updates[req.last_received_update + 1:] == []:
                self.condition.wait()
            new_updates = self.updates[req.last_received_update + 1:]
            response = GetUpdatesResponse()
            for update in new_updates:
                response.updates.add().CopyFrom(update)
            response.update_index = req.last_received_update + len(new_updates)
            return response</code>

クライアント内の個別のスレッド

<code class="python">request = GetUpdatesRequest()
request.last_received_update = -1
while True:
    stub = UpdaterStub(channel)
    try:
        response = stub.GetUpdates(request, timeout=60*10)
        handle_updates(response.updates)
        request.last_received_update = response.update_index
    except grpc.FutureTimeoutError:
        pass</code>

この例では、クライアントがロングポーリングを使用して、サーバーが開始するストリームを使用せずに更新を受信する方法を示します。

以上がロングポーリングを使用した gRPC サーバーからクライアントへのブロードキャストを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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