"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como você pode implementar a transmissão de eventos de servidor para cliente no gRPC usando uma abordagem de pesquisa longa?

Como você pode implementar a transmissão de eventos de servidor para cliente no gRPC usando uma abordagem de pesquisa longa?

Publicado em 2024-11-03
Navegar:180

How can you implement server-to-client event broadcasting in gRPC using a long-polling approach?

Transmitindo eventos em gRPC do servidor para clientes

Ao criar aplicativos envolvendo vários clientes conectados a um servidor, muitas vezes é necessário transmitir eventos para todos os clientes conectados. No gRPC, existem várias abordagens para conseguir isso.

Uma opção a considerar é usar uma abordagem de pesquisa longa. Isso envolve fazer com que os clientes pesquisem periodicamente o servidor em busca de atualizações. Quando ocorre um evento, o servidor notifica todos os clientes conectados, acionando suas chamadas de polling para retornar com as novas informações.

Para implementar uma abordagem de pesquisa longa em Python, considere o código a seguir (uma implementação semelhante é possível em outras linguagens como Go):

# SERVER
class UpdaterServer(UpdaterServicer):
    def __init__(self):
        self.condition = threading.Condition()
        self.updates = []

    def post_update(self, update):
        with self.condition:
            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

# SEPARATE THREAD IN CLIENT
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

Neste exemplo:

  • O método post_update() permite que os clientes sejam notificados sobre eventos.
  • O servidor mantém uma lista de atualizações e notifica os clientes quando uma nova atualização estiver disponível.
  • O cliente pesquisa o servidor periodicamente, aguardando atualizações.
  • Quando ocorrem eventos, o servidor aciona as chamadas de pesquisa do cliente para retornar com as informações atualizadas.

O uso de uma abordagem de pesquisa longa garante que todos os clientes conectados recebam eventos de transmissão e fornece uma maneira confiável de comunicar atualizações a várias partes.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3