Habilitar atualizações automáticas em um aplicativo Web usando o Serviço do SignalR

Concluído

Aplicativo Web baseado em sondagem.

Em seguida, vamos passar da sondagem para um aplicativo que envia atualizações de dados por push (à medida que ocorrem) para os clientes conectados. Esse novo design reduz o tráfego e torna a interface do usuário mais eficiente por atualizar apenas quando há alterações nos dados. As três tecnologias que vamos usar para distribuir essa solução atualizada são o Azure Cosmos DB, o Azure Functions e o SignalR.

  • Azure Cosmos DB: À medida que os dados são alterados no banco de dados, o Azure Cosmos DB expõe um feed de alterações. O suporte ao feed de alterações no Azure Cosmos DB funciona escutando um contêiner do banco de dados para ver se há alterações. Em seguida, ele gera a lista classificada de documentos alterados na ordem em que eles foram modificados. Ao escutar o feed de alterações, seu aplicativo pode reagir automaticamente às alterações nos dados.

  • Azure Functions: A principal diferença entre essa função e a função getStocks original é que agora a função é disparada com base nas alterações em nossos dados. No exercício anterior, disparamos nossa função com base em solicitações do cliente e recuperamos todos os dados por meio de uma associação de entrada do Azure Cosmos DB. O uso do gatilho do Azure Cosmos DB automaticamente torna nossa recuperação de dados mais eficiente. O Azure Functions tem uma associação que executa código sempre que dados são atualizados em um feed de alterações do Azure Cosmos DB. Quando uma função está escutando o feed de alterações, você pode trabalhar com um subconjunto dos dados que representam apenas alterações de dados.

  • Azure SignalR: Esse serviço fornece comunicação bidirecional com uma conexão do SignalR no cliente que escuta as transmissões do SignalR por meio do aplicativo do Azure Functions.

SignalR e conexões persistentes

Em contraste com a sondagem, um design mais favorável conta com conexões persistentes entre o cliente e o servidor. Estabelecer uma conexão persistente permite que o servidor envie dados por push ao cliente. A natureza sob demanda da conexão reduz o tráfego de rede e a carga no servidor. O SignalR permite que você adicione facilmente esse tipo de arquitetura ao seu aplicativo.

O SignalR é uma abstração de uma série de tecnologias que permite que seu aplicativo tire proveito da comunicação bidirecional entre o cliente e o servidor. O SignalR lida com o gerenciamento de conexões automaticamente e permite transmitir mensagens a todos os clientes conectados ao mesmo tempo, como uma sala de chat. Você também pode enviar mensagens para clientes específicos. A conexão entre o cliente e o servidor é persistente, diferente de uma conexão HTTP clássica, que é restabelecida para cada comunicação.

Um benefício importante da abstração fornecida pelo SignalR é a maneira como ela dá suporte a fallbacks de "transporte". Um transporte é um método de comunicação entre o cliente e o servidor. Conexões do SignalR começam com uma solicitação HTTP padrão. Enquanto o servidor avalia a conexão, o método de comunicação (transporte) mais adequado é selecionado. Quando combinada com uma conexão persistente com o cliente, a função pode contatar clientes individuais sob demanda, que é a base de uma arquitetura de aplicativo em tempo real. Os transportes são escolhidos dependendo das APIs disponíveis no cliente:

  • HTML 5: Para clientes que dão suporte ao HTML 5, o transporte da API WebSockets é usado por padrão.
  • WebSockets: Se o cliente não der suporte a WebSockets, o SignalR fará fallback de Server Sent Events (também conhecido como EventSource).
  • Outras tecnologias: Para clientes mais antigos, a sondagem longa do Ajax ou o Forever Frame (apenas para IE) é usado para simular uma conexão bidirecional.

A camada de abstração oferecida pelo SignalR fornece dois benefícios ao seu aplicativo. A primeira vantagem é que seu aplicativo fica pronto para desenvolvimentos futuros. Conforme a Web evoluir e APIs superiores ao WebSockets ficarem disponíveis, seu aplicativo não precisará ser alterado. Você poderia atualizar para uma versão do SignalR com suporte para todas as novas APIs e não precisaria reformular o código do seu aplicativo.

A segunda vantagem é que o SignalR permite que o aplicativo seja preterido gradualmente, dependendo das tecnologias com suporte do cliente. Se ele não der suporte ao WebSockets, serão usados Server Sent Events. Se o cliente não for compatível com Server Sent Events, ele usará a sondagem longa do Ajax e assim por diante.

Vamos avaliar como podemos usar o SignalR para transmitir informações de uma função que lê o feed de alterações do Azure Cosmos DB.