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中文網其他相關文章!