首頁  >  文章  >  後端開發  >  如何透過長輪詢實現 gRPC 伺服器到客戶端的廣播?

如何透過長輪詢實現 gRPC 伺服器到客戶端的廣播?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 20:06:02686瀏覽

How to Implement gRPC Server-to-Client Broadcasting with Long-Polling?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn