Open tnfAngel opened 5 months ago
El problema actual y por lo que no he sacado el tema es que ahora mismo la estructura de los documentos impide hacer esto eficientemente, hay que descomprimir y leer el campo para verificar si el documento sigue válido o no y puede llegar a ser costoso de CPU esto es el primer problema.
El segundo es el que estás comentando, iterar todos los documentos constantemente (en caso del método simple) es ineficiente y añade una carga de E/S constante. Esto ya se puede remediar mediante una base de datos y almacenar los metadatos del documento, si no se quiere picar la cabeza SQLite debería ser suficiente, aunque preferiría primero remediar y establecer una estructura firme para los documentos antes de meterme de lleno con esto.
El problema actual y por lo que no he sacado el tema es que ahora mismo la estructura de los documentos impide hacer esto eficientemente, hay que descomprimir y leer el campo para verificar si el documento sigue válido o no y puede llegar a ser costoso de CPU esto es el primer problema.
El segundo es el que estás comentando, iterar todos los documentos constantemente (en caso del método simple) es ineficiente y añade una carga de E/S constante. Esto ya se puede remediar mediante una base de datos y almacenar los metadatos del documento, si no se quiere picar la cabeza SQLite debería ser suficiente, aunque preferiría primero remediar y establecer una estructura firme para los documentos antes de meterme de lleno con esto.
Si, lo de la base de datos aparte lo veo buena idea
El problema actual y por lo que no he sacado el tema es que ahora mismo la estructura de los documentos impide hacer esto eficientemente, hay que descomprimir y leer el campo para verificar si el documento sigue válido o no y puede llegar a ser costoso de CPU esto es el primer problema.
El segundo es el que estás comentando, iterar todos los documentos constantemente (en caso del método simple) es ineficiente y añade una carga de E/S constante. Esto ya se puede remediar mediante una base de datos y almacenar los metadatos del documento, si no se quiere picar la cabeza SQLite debería ser suficiente, aunque preferiría primero remediar y establecer una estructura firme para los documentos antes de meterme de lleno con esto.
ya, ese también es un gran problema
Ahora que ya ha quedado liquidado el problema de los documentos ambas opciones serían factibles, pero solo la segunda sería para futuro.
Podríamos mover todas las cabeceras a la base de datos y mantener el documento exclusivamente para los datos, esto mejoraría enormemente el rendimiento porque solo se tendrían que hacer consultas para validar el documento. Las operaciones en disco pueden llegar a ser caras y si en un futuro se quiere añadir otra forma de almacenamiento remoto se podrá implementar fácilmente.
Entonces se hará una base de datos separada
La implementación básica de la base de datos ha empezado en este PR #163
Bien, hay un problema y es que los documentos expirables solo se borran bajo demanda, en concreto cuando un usuario intenta acceder a ellos, entonces yo proponía dos métodos para ahorrar un poco de espacio
Escanear e iterar sobre cada documento y eliminar asincronasmente y preferiblemente secuencialmente para aliviar un poco las cargas cada documento que ya haya expirado, esto ejecutarlo cada cierto tiempo
parecido al método simple, pero esa vez intentando eliminar un poco las iteraciones y lecturas innecesariarias cacheado las claves y expiraciones en forma de tupla y metiéndolos en un Array a los documentos que están próximos a expirar, por ejemplo < 1h.
en los dos métodos (sobre todo el primero) existen iteraciones y lecturas innecesariarias, por ejemplo los documentos permanentes nunca cumpliría las condiciones, también se puede mitigar aún más separando las carpetas, por ejemplo una para documentos permanentes y otra para temporales, pero habría que cambiar las apis de lectura, escritura, modificación, etc así que no se si merece la pena
Que sugerencias tenéis o como veis esto vosotros @JSPaste/developers