Pregunta

Estoy trabajando en un sistema que refleja conjuntos de datos remotos usando iniciales y deltas. Cuando ingresa una inicial, elimina de forma masiva cualquier cosa preexistente e inserta en masa los datos nuevos. Cuando entra un delta, el sistema hace un montón de trabajo para traducirlo en actualizaciones, inserciones y eliminaciones. Las iniciales y los deltas se procesan dentro de transacciones largas para mantener la integridad de los datos.

Lamentablemente, la solución actual no se adapta muy bien. Las transacciones son tan grandes y de larga duración que nuestro RDBMS se atasca con varios problemas de contención. Además, no existe una buena pista de auditoría sobre cómo se aplican los deltas, lo que dificulta la resolución de problemas que provocan que las versiones local y remota del conjunto de datos no estén sincronizadas.

Una idea es no ejecutar las iniciales y deltas en las transacciones en absoluto y, en su lugar, adjuntar un número de versión a cada registro que indique de qué delta o inicial proviene. Una vez que se ha cargado correctamente una inicial o delta, se puede alertar a la aplicación de que hay disponible una nueva versión del conjunto de datos.

Esto simplemente deja el problema de cómo componer exactamente una vista de un conjunto de datos hasta una versión dada desde la inicial y los deltas. (TimeMachine de Apple hace algo similar, usando enlaces físicos en el sistema de archivos para crear una "vista" de un cierto punto en el tiempo).

¿Alguien tiene experiencia en resolver este tipo de problema o implementar esta solución en particular?

¡Gracias!

¿Fue útil?

Solución 2

Gracias a quienes lo intentaron.

Para cualquier otra persona que termine aquí, estoy comparando una solución que agrega una columna "dataset_version_id" y "dataset_version_verb" a cada tabla en cuestión.Luego, se utiliza una subconsulta correlacionada dentro de un procedimiento almacenado para recuperar el dataset_version_id actual al recuperar registros específicos.Si la última versión del registro tiene dataset_version_verb de "eliminar", se filtra de los resultados mediante una cláusula WHERE.

Este enfoque tiene un impacto de rendimiento promedio de ~ 80% hasta ahora, lo que puede ser aceptable para nuestros propósitos.

Otros consejos

tener un escritor y varias bases de datos de lectores.Envía la escritura a una base de datos y hace que propague exactamente los mismos cambios a todas las demás bases de datos.Las bases de datos del lector eventualmente serán consistentes y el tiempo de actualización es muy rápido.He visto que esto se hace en entornos que obtienen más de 1 millón de visitas a la página por día.Es muy escalable.Incluso puede colocar un enrutador de hardware delante de todas las bases de datos leídas para equilibrar la carga.

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