(ASP.NET) ¿Cómo ir sobre la creación de un contador de tiempo real que rastrea los cambios de base de datos?

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

Pregunta

Aquí está el problema.

En un sitio que he tomado recientemente sobre un seguimiento de "millas" se corrieron en un día. Por lo que un usuario puede iniciar sesión en el sitio, añadir que corrían 5 millas. Esto se añade a la base de datos.

Al final del día, alrededor de la 1am, se ejecuta un servicio que calcula todas las millas, todos los usuarios corrieron en el día y da salida a un archivo de texto a App_Data. Ese archivo de texto a continuación, se muestra en flash en la página de inicio.

Creo que esto es un poco ridículo. Me dijeron que tenían que hacer esto debido a problemas de rendimiento masivo. No me van a decir exactamente cómo lo hacían antes o cuál es el problema principal era el rendimiento.

Entonces, ¿qué método se tomarían ustedes? Lo primero que me vino a la mente fue un servicio web que consiga los datos a través de una llamada AJAX. Tal vez cada vez que se añade una nueva entrada "milla", un gatillo se dispara y actualiza la tabla "GlobalMiles".

Te agradecería cualquier información o consejos sobre esto.

Muchas gracias!

¿Fue útil?

Solución

La respuesta a esta pregunta es un poco difícil ya que no conocemos todos sus requisitos y algo que no funcionó antes. Así que aquí están algunas ideas diferentes.

En primer lugar, revisar sus supuestos. Generación de un informe estático una vez al día es una solución perfectamente válida si todo lo que necesita es informes diarios. ¿Por qué ir a las bases de datos varias veces throghout el día si todo lo que se necesita es una instantánea (por ejemplo, una gran cantidad de software de blog utilizado para escribir archivos HTML cuando un blog se publicó, en lugar de servir a la entrada de la base de datos cada vez - muchos todavía como una optimización). Es el "tiempo real" función de algo que va a agregar?

No me saltar a AJAX de inmediato. Utilizar el mismo método de entrada, basta con mover el informe de estática a dinámica. Si lo hace demasiado a la vez es una buena manera de conseguir que te enterrados. Al cambiar el código existente Trato de encontrar áreas que puedo cambiar de forma aislada facturan con la menor cantidad de impacto en el resto de la aplicación. A continuación, una vez que tenga el informe dinámico entonces se puede añadir AJAX (y por favor utilice progresiva mejora).

En cuanto al propio informe dinámico que tiene algunas opciones.

Por supuesto, puede simplemente SELECT SUM (), pero parece que haría que los problemas de rendimiento si cada usuario tiene un gran número de entradas.

Si su base de datos lo permite, me gustaría ver el uso de un href="http://technet.microsoft.com/en-us/library/cc917715.aspx" rel="nofollow noreferrer"> vista (a veces llamado una vista materializada). Se debe apoyar permite actualizaciones rápidas a los datos en tiempo real suma:

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)

Si la sobrecarga de que es demasiado, solución de @ jn29098 es una buena vez. Enrollarlo utilizando una tarea programada. Si hay una gran cantidad de entradas para cada usuario, sólo se podía añadir el delta desde la última vez que se ejecutó la tarea.

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

Si no se preocupan por el almacenamiento de las entradas individuales, pero sólo el total que puede actualizar la cuenta sobre la marcha:

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

Se puede usar este método en combinación con el procedimiento almacenado que se suma la entrada y tienen ambos mundos.

Por último, el método de disparo funcionaría también. Es una alternativa a la vista indizada en el que hacer la actualización a sí mismo en una tabla de SQL instad hacerlo automáticamente. También es similar a la opción anterior en el que mover la actualización global del procedimiento almacenado y en un gatillo.

Las tres últimas opciones hacen que sea más difícil de manejar la situación cuando se elimina una entrada, aunque si eso no es una característica de su aplicación, entonces es posible que no tenga que preocuparse por eso.

Ahora que tienes materializado, datos en tiempo real en su base de datos ahora se puede generar dinámicamente su informe. A continuación, puede añadir fantasía con AJAX.

Otros consejos

Si son verdaderamente teniendo problemas de rendimiento debido a que muchos accesos a la base de datos, entonces le sugiero que se tome toda la entrada y meter en una cola de mensajes (MSMQ). A continuación, puede tener un servicio en el otro extremo que recoge los mensajes y hace una inserción masiva de los datos. De esta manera tiene un menor número de golpes db. A continuación, puede dar salida al archivo de texto en la actualización también.

Me gustaría crear una tabla resumen que se enrolla una vez / hora o nocturno, que calcula el total de millas de ejecución. Para las solicitudes individuales se podía sacar de la tabla de resumen de todas las noches, además de los miles registrada adicional para el período comprendido entre el último cálculo de resumen y cuando el usuario visita la página para obtener el total para ese usuario.

¿Cuántos usuarios está hablando y el número de registro de los registros por día?

scroll top