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