Heim  >  Artikel  >  Backend-Entwicklung  >  Wie implementiert man gRPC-Server-zu-Client-Broadcasting mit Long-Polling?

Wie implementiert man gRPC-Server-zu-Client-Broadcasting mit Long-Polling?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 20:06:02686Durchsuche

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

gRPC-Server-zu-Client-Broadcasting

Bei gRPC entsteht eine häufige Herausforderung, wenn Ereignisse vom Server an mehrere verbundene Clients übertragen werden. Die gestellte Frage sucht nach Anleitung, wie dies mithilfe von Streams erreicht werden kann, insbesondere wenn der Server weiß, wer verbunden ist und wie er jeden Client ansprechen soll.

Verwenden Sie einen Long-Polling-Ansatz

Eine alternative Lösung zu Streams ist die Implementierung eines Long-Polling-Ansatzes. Bei dieser Technik senden Clients fortlaufend Anfragen an den Server, wodurch die Verbindung aufrechterhalten wird. Wenn auf dem Server ein Ereignis auftritt, werden alle wartenden Clients benachrichtigt und aufgefordert, den Vorgang zu beenden und eine neue Anfrage zu erstellen.

Codebeispiel für Long-Polling

Das Folgende Codebeispiel veranschaulicht, wie Long-Polling in Python implementiert werden kann:

.PROTO Definitions

<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>

Servercode

<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>

Separater Thread im Client

<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>

Dieses Beispiel zeigt, wie Clients Long-Polling verwenden können, um Updates ohne serverinitiierte Streams zu empfangen.

Das obige ist der detaillierte Inhalt vonWie implementiert man gRPC-Server-zu-Client-Broadcasting mit Long-Polling?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn