Dieser Ansatz ist so ziemlich der akzeptierte Weg, um irgendetwas in unserem Unternehmen zu tun. Ein einfaches Beispiel: Wenn ein Datenelement für einen Kunden von einem Dienst angefordert wird, rufen wir alle Daten für diesen Kunden (relevanter Teil des Dienstes) ab, speichern sie in einem In-Memory-Wörterbuch und stellen sie dann bei folgenden Anforderungen von dort aus bereit (Wir betreiben Singleton-Dienste). Jedes Update geht an die Datenbank und aktualisiert dann das In-Memory-Wörterbuch. Es scheint alles einfach und harmlos zu sein, aber wenn wir kompliziertere Geschäftsregeln implementieren, ist der Cache nicht mehr synchron und wir müssen uns mit schwer zu findenden Fehlern auseinandersetzen. Manchmal verschieben wir das Schreiben in die Datenbank und behalten bis dahin neue Daten im Cache. Es gibt Fälle, in denen wir Millionen von Zeilen im Speicher speichern, weil die Tabelle viele Beziehungen zu anderen Tabellen hat und wir aggregierte Daten schnell anzeigen müssen.
All diese Cache-Handhabung ist ein großer Teil unserer Codebasis, und ich spüre, dass dies nicht der richtige Weg ist, dies zu tun. All dieses Jonglieren fügt dem Code zu viel Rauschen hinzu und macht es schwierig, die tatsächliche Geschäftslogik zu verstehen. Ich glaube jedoch nicht, dass wir Daten in angemessener Zeit bereitstellen können, wenn wir jedes Mal auf die Datenbank zugreifen müssen.
Ich bin unglücklich über die aktuelle Situation, aber ich habe keine bessere Alternative. Meine einzige Lösung wäre die Verwendung des NHibernate 2nd Level Cache, aber ich habe fast keine Erfahrung damit. Ich weiß, dass viele Unternehmen Redis oder MemCached stark nutzen, um Leistung zu erzielen, aber ich habe keine Ahnung, wie ich sie in unser System integrieren würde. Ich weiß auch nicht, ob sie eine bessere Leistung als speicherinterne Datenstrukturen und Abfragen erzielen können.
Gibt es alternative Ansätze, die ich prüfen sollte?