ホームページ  >  記事  >  バックエンド開発  >  gRPC サーバーからすべてのクライアントにイベントをブロードキャストするにはどうすればよいですか?

gRPC サーバーからすべてのクライアントにイベントをブロードキャストするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 06:00:30855ブラウズ

How to Broadcast Events from a gRPC Server to All Clients?

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

gRPC では、ユーザーがクライアントとしてサーバーに接続するときにブロードキャストすることが重要ですこのイベントを接続されているすべてのクライアントに送信します。これを実現するには、サーバー側オブザーバーまたはロングポーリング アプローチのいずれかを活用できます。

サーバー側オブザーバー

サーバーは、接続されているオブジェクトのリストを維持できます。クライアント。新しいクライアントが接続すると、対応するストリームがリストに追加されます。イベントをブロードキャストするには、サーバーは単にリストを反復処理し、イベントを各ストリームに送信します。ただし、このアプローチでは、サーバーが接続されたクライアントを追跡し、ストリーム サブスクリプションを管理する必要があるため、複雑になる可能性があります。

ロングポーリング アプローチ

ロング ポーリングは、代替ソリューションを提供します。 。各クライアントは、サーバーとの間で存続期間の長いストリームを確立します。クライアントはサーバーにリクエストを送信し、応答を待ちます。サーバーはイベントが発生するまでリクエストを保持します。イベントが発生すると、サーバーはクライアントに応答し、ロング ポーリング呼び出しをトリガーして戻ります。

ロング ポーリングを使用した例を次に示します。

<code class="python"># Server-side code
class UpdaterServer:
    def post_update(self, update):
        with self.condition:
            self.updates.append(update)
            self.condition.notify_all()

    def GetUpdates(self, req, context):
        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

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

新しいイベントが発生すると、サーバーは post_update() を呼び出し、待機中のすべてのクライアントに通知します。クライアントのロングポーリング呼び出しは、更新された情報とともに返されます。

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

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