Einfache, schnelle und verteilte Open-Source-Cache-Bibliothek zum Einbetten in Java

Ich muss den Sitzungsstatus für eine Webanwendung speichern, die auf mehreren Servern bereitgestellt wird. Ich möchte klebrige Sitzungen oder Sitzungsreplikation vermeiden, da ich möchte, dass die Anwendung in sich geschlossen ist und sich nicht auf Servlet-Container-spezifische Konfigurationen verlässt.

Logischerweise bleibt also nur die Möglichkeit, die Sitzung woanders zu verwalten, und die logische Richtung ist eine Datenbank, die alle Server gemeinsam nutzen. Aber das wird zu einem Engpass (und einem Single Point of Failure), außerdem ist eine relationale Datenbank nicht wirklich darauf ausgelegt, Sitzungsdaten zu speichern. Eine verteilte NoSQL-Lösung wäre eine bessere Wahl, aber auch das ist eine weitere zu verwaltende Komponente.

Also dachte ich an eine schnelle und verteilte einbettbare Java-Cache-Bibliothek, die die Daten über alle Knoten hinweg repliziert, sodass der Client unabhängig davon, welchen Server er erreicht, Zugriff auf den neuesten Stand hat.

Hazelcast scheint eine gute Wahl zu sein, aber ich würde nur eine Karte ohne andere Funktionen von Hazelcast brauchen, also scheint es ein bisschen zu viel für nur einen verteilten Container von Schlüssel-Wert-Paaren zu sein.

Aber ansonsten kann ich anscheinend keine andere Bibliothek finden, die den Anforderungen entspricht. Idealerweise sollte es eine Open-Source-Bibliothek sein, etwas, das ich in einem kommerziellen Produkt frei verwenden kann.

Irgendwelche Ideen?

Ich habe EHCache verwendet, aber ich denke, es ist nicht leichter als Hazelcast ...
@Nicolas Raoul: Danke für den Vorschlag, aber ich suche nach einer Open-Source-Bibliothek (ich habe meine Frage aktualisiert). Soweit ich weiß, bedeutet verteilter EHCache Terracotta und BigMemory Max, die lizenziert sind.
„Terracotta entwickelt, wartet und unterstützt Ehcache aktiv als professionelles Open-Source-Projekt, das unter einer Apache-2-Lizenz verfügbar ist.“ ehcache.org
@Nicolas Raoul: das habe ich nicht gemeint. Soweit ich weiß, sind die verteilten Fähigkeiten von EHCache nicht in der Open-Source-Distribution verfügbar, z . B. ehcache.org/documentation/get-started/about-distributed-cache . Liege ich falsch?
EHCache ist in das Open-Source-Produkt Alfresco eingebettet und bietet verteilte Cache-Funktionen. Ich bin mir also ziemlich sicher, dass die verteilten Fähigkeiten von EHCache auch in der Open-Source-Distribution verfügbar sind. Diese Seite ist ziemlich irreführend, sie bemühen sich sehr, die Nicht-Open-Source-Version zu verkaufen, würde ich sagen.
Hazelcast ist gut. aber ich habe keine Ahnung von einem Persistenzmechanismus: stackoverflow.com/questions/25621860/…
@NicolasRaoul hast du einen Link zur Dokumentation zu dieser Funktion? Ist es in ehcache 2 und wird es auch in 3 sein?
@Karussell: Entschuldigung, ich erinnere mich nicht wirklich an die Details :-/

Antworten (2)

Ehcache- und Guava-Caches sind ziemlich beliebte und nützliche In-Process-Caches. Wenn die Verwendung eines externen Prozesses für den Cache möglich ist, eignen sich Memcached und Redis gut für diesen Zweck.

Soweit ich weiß, wird Guava Cache nicht vertrieben. Redis ist eine in C geschriebene NoSQL-Lösung und kann nicht in eine Java-Anwendung eingebettet werden (Sie können einen Java-Client einbetten, aber nicht die Redis-Installation), während Memcached nicht so funktioniert, wie ich es möchte (das heißt, auf allen die gleichen Daten zu haben die Knoten, dh Replikation).

Vollständige Offenlegung: Ich arbeite für Alachisoft.

Sie können NCache für .Net oder TayzGrid für verteilten Java-Cache überprüfen . Beide Projekte sind Open Source.

Ihre Anforderung ist zu bekommen;

schnelle und verteilte integrierbare Java-Cache-Bibliothek, die die Daten über alle Knoten hinweg repliziert, sodass der Client unabhängig davon, welchen Server er erreicht, Zugriff auf den neuesten Stand hat.

Dies ist, was diese beiden frei zur Verfügung stellen. Verwenden Sie es für das, wofür Sie es brauchen, und lassen Sie die anderen Funktionen weg.

Kurze Codeübersicht aus dem verlinkten Blog

import com.alachisoft.TayzGrid.web.caching.Cache;
    import com.alachisoft.TayzGrid.runtime.*;

    public class MyCachingSample {
        private String url = "dbc:msql://20.200.20.1:1114/MyDatabase";


        public Employee GetEmployee(String empId) throws Exception {
            Employee emp = null;
            try {
                Cache cache = TayzGrid.initializeCache("MyDistributedCache");
                emp = (Employee) cache.get(empId);
                //If key not found in cache, Load from the database
                if (emp == null) {
                    //Your logic goes here
                    ResultSet rs = stmt.executeQuery("SELECT * FROM Employee WHERE EmpId ='" + empId + "'");
                    if (rs.next()) {
                        emp = new Employee();
                        emp.EmpId = rs.getString("EmpId");

                        //Cache key for future use
                        cache.insert(empId, emp, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default);
                    }
                }
            } catch (Exception exp) {
                throw exp;
            }
            //return the required object
            return emp;
        }
    }

Sie müssen jedoch einen einfachen Sitzungsanbieter für sich selbst schreiben, um Sticky Sessions zu unterstützen, oder Sie könnten NCache oder TayzGrid kaufen, um diese Funktionen zu erhalten. TayzGrid oder NCache können und werden auch als verteilter Cache oder als In-Memory Data Grid oder manchmal als In-Memory Key Value Store verwendet. Es hängt ganz davon ab, was Ihre Bedürfnisse sind.

Wenn Sie Unterstützung benötigen oder planen, es für ein Unternehmen zu verwenden, können Sie jederzeit die kostenpflichtigen Lizenzen erwerben. Es ist eine funktionsreichere Version und bietet Unterstützung. Wir haben über 10 Jahre Branchenerfahrung, daher ist es stabil für eine vollständige Produktionsumgebung.