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 중국어 웹사이트의 기타 관련 기사를 참조하세요!