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