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

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

Mary-Kate Olsen
リリース: 2024-11-02 06:00:30
オリジナル
881 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート