Pregunta

Tenemos una aplicación que toma los datos en tiempo real y lo inserta en la base de datos. es en línea durante 4,5 horas al día. Insertamos segundos datos por segundo en 17 mesas. El usuario en cualquier momento podrá consultar cualquier tabla para los últimos segundos datos y algún registro en la historia ...

Cuidado de la alimentación y la inserción se realiza mediante una aplicación de consola de C # ...

Cuidado de las peticiones del usuario se realiza a través de un servicio WCF ...

Nos dimos cuenta de que la inserción es nuestro cuello de botella; la mayoría de las veces se toma allí. Hemos invertido una gran cantidad de tiempo tratando de afinar las mesas y indecies embargo, los resultados no fueron satisfactorios

Suponiendo que tenemos memoria suffecient, lo que es la mejor práctica para insertar datos en la memoria en lugar de tener la base de datos. Actualmente estamos utilizando tablas de datos que se actualizan y se insertan cada segundo Un compañero nuestro sugirió otro servicio WCF en lugar de la base de datos entre la alimentación y el controlador de WCF usuarios-solicitudes-controlador. La capa intermedia WCF se supone que está basado en TCP y guarda los datos en su propia memoria. Se puede decir que el controlador de alimentación podría tratar con usuarios-peticiones en lugar de tener una capa intermedia entre 2 procesos, pero queremos cosas separadas por lo que si el feed-manejador se estrella queremos seguir siendo capaz de proporcionar al usuario los registros actuales

Estamos limitados en el tiempo, y queremos pasar todo a la memoria de corto período. Está teniendo un WCF en medio de 2 procesos de un mal que hay que hacer? Sé que las peticiones de añadir un poco por encima, pero todos estos 3 proceso (feed-manipulador, base de datos en memoria (WCF), fácil de petición-controlador (WCF) van a estar en la misma máquina y ancho de banda no será mucho de un problema.

Por favor, ayuda!

¿Fue útil?

Solución

Me gustaría ver en la creación de una memoria caché de los datos (por ejemplo, que también puede reducir selecciona de bases de datos), y los datos en la caché Invalidate una vez que se ha escrito en la base de datos. De esta manera, se puede tratar por llamadas a hacer un inserto grande en lugar de muchos más pequeños, pero mantener los datos en memoria de tal manera que los lectores puedan leerlo. En realidad, si se sabe cuando los datos se estropea, puede evitar la lectura de la base de datos en su totalidad y utilizarlo como almacén de respaldo -. De esta manera, el rendimiento de base de datos sólo afectará el tamaño de su caché obtiene

Anulación de los datos en la caché o bien se basa en si su escrito a la base de datos o su rancio ido, lo que ocurra última , no por primera vez.

La capa de caché no tiene por qué ser complicado, sin embargo, debe ser multi-hilo para albergar los datos y también guardarlo en el fondo. Esta capa se sentaba justo detrás del servicio WCF, el medio de conexión, y el servicio WCF debe ser mejorada para contener la lógica de la aplicación de consola + la idea de procesamiento por lotes. A continuación, la aplicación de consola solo puede conectarse a WCF y arrojar resultados en ella.

Actualización: la única otra cosa que decir es invertir en un generador de perfiles para ver si usted está introduciendo ningún problema de rendimiento en el código que se están enmascarados. Además, el perfil de su base de datos. Usted menciona que necesita inserciones rápidas y selecciona - por desgracia, por lo general el comercio se enfrenten entre sí ...

Otros consejos

¿Qué tipo de base de datos está utilizando? MySQL tiene un motor de memoria de almacenamiento de lo que parece ser adecuado para este tipo de cosas.

¿Está utilizando DataTable con adaptador de datos? Si es así, yo recomendaría que se le cae por completo. Insertar sus registros directamente utilizando DbCommand. Cuando los usuarios solicitan informes, leer datos utilizando DataReader o rellenar objetos DataTable utilizando DataTable.Load (IDataReader).

Relato de datos en la memoria tiene el riesgo de perder datos en caso de accidentes o fallas de energía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top