(ASP.NET) Como você iria sobre a criação de um contador em tempo real, que controla as alterações de banco de dados?

StackOverflow https://stackoverflow.com/questions/1072067

Pergunta

Aqui está a questão.

Em um site eu tenho tido recentemente sobre ela rastreia "milhas" você executou em um dia. Assim, um usuário pode entrar no site, adicione que correu 5 milhas. Este é então adicionado ao banco de dados.

No final do dia, cerca de 1h, um serviço é executado que calcula todas as milhas, todos os usuários correu no dia e gera um arquivo de texto para App_Data. Esse arquivo de texto é exibido em flash na página inicial.

Eu acho que isso é uma espécie de ridículo. Foi-me dito que tinha que fazer isso devido a problemas de desempenho maciças. Eles não vão me dizer exatamente como eles estavam fazendo-o antes ou o que o grande problema de desempenho foi.

Então, o que abordagem vocês tomar? A primeira coisa que me veio à mente era um serviço web que obtém os dados por meio de uma chamada de AJAX. Talvez cada vez que uma nova entrada "milha" é adicionado, um gatilho é disparado e atualiza a tabela "GlobalMiles".

Eu apreciaria qualquer informação ou dicas sobre isso.

Muito obrigado!

Foi útil?

Solução

A resposta a esta pergunta é um pouco difícil, pois lá não sabemos todas as suas necessidades e algo não funcionou antes. Então, aqui estão algumas idéias diferentes.

Em primeiro lugar, rever suas premissas. Gerando um relatório estático uma vez por dia é uma solução perfeitamente válido se tudo que você precisa é de relatórios diários. Por que atingiu as múltiplas base de dados vezes throghout o dia, se tudo o que é necessário é um instantâneo (por exemplo, lotes de blog software usados ??para arquivos de html gravação quando um blog foi publicado em vez de servir-se a entrada do banco de dados de cada vez - muitos ainda o fazem como uma optimização). É o "tempo real" recurso de algo que você está adicionando?

Eu não saltar para AJAX imediatamente. Use o mesmo método de entrada, basta mover o relatório de estático para dinâmico. Fazer muito de uma vez é uma boa maneira de obter-se enterrado. Ao alterar o código existente I tentar encontrar áreas que eu posso mudar isoladamente wih o mínimo de impacto para o resto da aplicação. Em seguida, depois de ter o relatório dinâmico podes adicionar AJAX (e utilize progressiva aprimoramento ).

Quanto ao relatório dinâmico em si você tem algumas opções.

Claro que você pode apenas selecionar SUM (), mas parece que causaria os problemas de desempenho se cada usuário tem um grande número de entradas.

Se o seu banco de dados suporta-lo, eu iria olhar para usando um exibição indexada (às vezes chamado de uma visão materializada). Deve apoiar permite atualizações rápidas para os dados de soma em tempo real:

CREATE VIEW vw_Miles WITH SCHEMABINDING AS 
SELECT SUM([Count]) AS TotalMiles, 
COUNT_BIG(*) AS [EntryCount],
UserId
FROM Miles
GROUP BY UserID
GO
CREATE UNIQUE CLUSTERED INDEX ix_Miles ON vw_Miles(UserId)

também Se a sobrecarga de que é de muito, @ jn29098 solução é uma boa uma vez. Enrolá-lo usando uma tarefa agendada. Se há um grande número de entradas para cada usuário, você só pode adicionar o delta da última vez que a tarefa foi executada.

UPDATE GlobalMiles SET [TotalMiles] = [TotalMiles] + 
  (SELECT SUM([Count]) 
    FROM Miles 
    WHERE UserId = @id 
      AND EntryDate > @lastTaskRun
    GROUP BY UserId)
WHERE UserId = @id

Se você não se preocupam com armazenar as entradas individuais, mas apenas o total que você pode atualizar a contagem em tempo real:

UPDATE Miles SET [Count] = [Count] + @newCount WHERE UserId = @id

Você pode usar esse método em conjunto com o SPROC que adiciona a entrada e têm dois mundos.

Finalmente, o seu método de gatilho iria funcionar tão bem. É uma alternativa para a exibição indexada onde você faz a atualização se em uma instad tabela de SQL fazê-lo automaticamente. Também é semelhante à opção anterior, onde você move a atualização global de fora do sproc e em um gatilho.

As três últimas opções torná-lo mais difícil de lidar com a situação quando uma entrada é removido, mas se isso não é uma característica de sua aplicação, então você pode não precisar se preocupar com isso.

Agora que você tem materializado, dados em tempo real em seu banco de dados agora você pode gerar dinamicamente seu relatório. Então você pode adicionar a fantasia com AJAX.

Outras dicas

Se eles são verdadeiramente ter problemas de desempenho devido a muitas visitas em banco de dados, então eu sugiro que você tome todas as entradas e empinar-lo em uma fila de mensagens (MSMQ). Então você pode ter um serviço na outra extremidade que pega as mensagens e faz uma inserção em massa dos dados. Desta forma, você tem menos golpes db. Então você pode dar saída ao arquivo de texto sobre a actualização também.

Gostaria de criar um quadro-resumo que está enrolado uma vez / hora ou noturno que calcula total de milhas executado. Para pedidos individuais que conseguimos extrair da tabela de resumo noturno mais quaisquer milhas registradas adicionais para o período entre o último cálculo cumulativo e quando o usuário visualiza a página para obter o total para esse usuário.

Como muitos usuários que você está falando e quantos registros de log por dia?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top