Este enfoque es más o menos la forma aceptada de hacer cualquier cosa en nuestra empresa. Un ejemplo simple: cuando se solicita un dato para un cliente de un servicio, buscamos todos los datos para ese cliente (parte relevante para el servicio) y lo guardamos en un diccionario en memoria y luego lo servimos desde allí en las siguientes solicitudes (ejecutamos servicios singleton). Cualquier actualización va a DB, luego actualiza el diccionario en memoria. Parece todo simple e inofensivo, pero a medida que implementamos reglas comerciales más complicadas, el caché se desincroniza y tenemos que lidiar con errores difíciles de encontrar. A veces aplazamos la escritura en la base de datos, manteniendo nuevos datos en caché hasta entonces. Hay casos en los que almacenamos millones de filas en la memoria porque la tabla tiene muchas relaciones con otras tablas y necesitamos mostrar datos agregados rápidamente.
Todo este manejo de caché es una gran parte de nuestra base de código y siento que esta no es la forma correcta de hacerlo. Todo este malabarismo agrega demasiado ruido al código y dificulta la comprensión de la lógica comercial real. Sin embargo, no creo que podamos servir datos en un período de tiempo razonable si tenemos que acceder a la base de datos cada vez.
No estoy contento con la situación actual, pero no tengo una mejor alternativa. Mi única solución sería usar el caché NHibernate de segundo nivel, pero casi no tengo experiencia con él. Sé que muchas campañas usan Redis o MemCached en gran medida para obtener rendimiento, pero no tengo idea de cómo las integraría en nuestro sistema. Tampoco sé si pueden funcionar mejor que las estructuras y consultas de datos en memoria.
¿Hay algún enfoque alternativo que deba considerar?