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

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

Barbara Streisand
リリース: 2024-11-02 02:45:30
オリジナル
878 人が閲覧しました

How to Implement Server to Client Broadcasting in gRPC?

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

gRPC 接続を確立するとき、多くの場合、サーバーからクライアントへのイベントや更新をブロードキャストする必要があります。接続されたクライアント。これを実現するには、さまざまなアプローチを使用できます。

Stream Observables

一般的なアプローチの 1 つは、サーバー側ストリームを利用することです。接続された各クライアントは、サーバーとの独自のストリームを確立します。ただし、他のサーバー/クライアント ストリームに直接サブスクライブすることは実現できません。

ロングポーリング

代替オプションは、ロングポーリングアプローチを実装することです。これには、クライアントが一定の間隔でサーバーを継続的にポーリングし、新しい更新をチェックすることが含まれます。更新を受信すると、クライアントは応答を受信し、次のポーリング間隔を待ちます。

実装例

ロング ポーリングを実装する方法の例を次に示します。 gRPC の使用:

サーバー側コード

<code class="python">import threading

class UpdaterServer:
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            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:]
            return GetUpdatesResponse(
                updates=new_updates,
                update_index=req.last_received_update + len(new_updates),
            )</code>
ログイン後にコピー

クライアント側コード (別スレッド)

<code class="python">from threading import Event

def handle_updates(updates):
    pass

event = Event()
request = GetUpdatesRequest(last_received_update=-1)

while not event.is_set():
    try:
        stub = UpdaterStub(channel)
        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 サイトの他の関連記事を参照してください。

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