Usando SqlCacheDependency para obter atualizações em tempo real? - ASP.NET
-
19-09-2019 - |
Pergunta
Eu gostaria de exibir atualizações em tempo real em uma página web (com base em um campo de status em uma tabela de banco de dados que é alterada por um processo externo). Baseado em minha pesquisa, existem várias maneiras de fazer isso.
- Long Polling (Comet) - Este parece ser complexo para implementar
- Polling Regular - Eu posso ter um gatilho método AJAX um banco de dados atingiu a cada 5 segundo para obter o status atual. Mas temo que isso terá problemas de desempenho.
Então eu li sobre o uso SqlCacheDependency
- basicamente o cache fica invalidado com base em um campo na tabela. Estou assumindo que eu posso usar o evento trigerred quando o cache é invalidado para mostrar a nova atualização para o usuário?
O que é uma solução fácil que não terá problemas de desempenho?
Solução
Em vez de polling o banco de dados uma abordagem mais escalável e performance seria a votação para a existência de um arquivo em seu servidor web, algo como um arquivo js leve. O conteúdo do arquivo não é importante, mas para lhe dar uma idéia de que você poderia ter um objeto JSON de algum tipo, que descreve em maior detalhe o resultado do processo.
Em seguida, o processo de fundo que está fazendo o processamento como a etapa final pode criar o arquivo ou chamar um serviço web em seu camada da web para fazer isso.
Veja como isso poderia funcionar.
Os usuários pressiona o botão que mensagens para o servidor
Servidor chutes de processo e retorna um identificador de exemplo C3201620-E622-4fe2-9F3A-E02FFA613F59
Web UI, em seguida, as pesquisas peridodically para a existência de C3201620-E622-4fe2-9F3A-E02FFA613F59.js, o javascript iria gerir o erro 404 e continuar a tentar até que ele recebe um 200
Espero que isso lhe dá algumas idéias.
Exemplo de código para lidar com 404 está em jQuery
$.ajax({
url: '/CheckForStatusChange/C3201620-E622-4fe2-9F3A-E02FFA613F59.json',
type: "GET",
success: function(result) {
},
error: function(request, status, error) {
//handle error here and setTimeOut
});
Outras dicas
Você tem 2 questões:
- recuperar os dados para empurrar
- Empurrando os dados para os clientes
O artigo # 1 é fácil, supondo que você tenha uma consulta bastante eficiente, e você não está consultando-lo para todos os usuários; apenas consulta, obter os dados, e empurrá-lo. Você pode usar a opção SqlDependency, ou você pode apenas sondar-lo; isso depende de como pesado seus dados estão.
Item # 2 é um pouco mais complicado, porque você precisa se quer acertar o servidor constantemente, ou usar um servidor de cometa. Nós escrevemos um servidor cometa .NET altamente escalável, WebSync , em cima da Congelado Montanha que poderia caber a conta. Essencialmente, você tem um processo separado que impulsiona a publicação e WebSync iria lidar com a empurrar os dados para seus clientes.