Write-Through und Write-Behind Caching mit Infinispan

Infinispan kann so konfiguriert werden, dass die Daten im Cache nicht durch die Applikation, sondern durch die Cache-Implementierung selbst in einer oder mehreren Drittsystemen persistiert werden. Infinispan abstrahiert für diese Datensynchronisation eine Schnittstelle namens CacheStore.
Als CacheStore-Implementierungen können Adapter für JDBC-Datenbanken, JPA-EntityFactories, Filesysteme o.ä. dienen.

CacheStore

Infinispan führt die Updates der Applikationen an den Daten im Cache selbstständig in den CacheStores durch. Das Laufzeitverhalten dieser Updates kann synchron (Write-Through) oder asynchron (Write-Behind) konfiguriert werden.

Write-Through

In diesem Modus sind Änderungen von Cache-Einträgen erst gültig, wenn die entsprechenden Änderungen in den CacheStores vollzogen sind. Das heißt praktisch, dass die Änderungen am CacheStore synchron im Client-Thread durchgeführt werden.

Ein grosser Vorteil dieses Modus ist, dass eine strenge Datenkonsistenz zwischen Cacheinhalt und CacheStore gewährleistet ist, beide haben von außen betrachtet den gleichen Dateninhalt. Im Gegenzug leidet die Performance im Bezug auf Antwortzeit und Verfügbarkeit, da Zugriff und Update des Caches wegen der synchronen Updates im CacheStore länger dauern.
Per default sind alle CacheStores im write-through Modus konfiguriert:

<?xml version="1.0" encoding="UTF-8"?>
<infinispan
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd"
      xmlns="urn:infinispan:config:6.0">
   <namedCache name="persistentCache">
      <persistence passivation="false">
         <singleFile fetchPersistentState="true"
                     ignoreModifications="false"
                     purgeOnStartup="false" location="${java.io.tmpdir}"/>
      </persistence>
   </namedCache>
</infinispan>

Whrite-Behind

In diesem Modus werden Änderungen des Caches asynchron in den CacheStore geschrieben, d.h. die Updates laufen in einem separaten Thread zum Anfragethread ab.

Ein grosser Vorteil dieser Variante ist, dass Änderungen des Caches nicht von den Änderungen des CacheStores abhängen und dadurch die Performance nicht beeinträchtigt wird. Dieser Vorteil führt allerdings dazu, dass der CacheStore für ein bestimmtes Zeitfenster im Vergleich zum Cache “stale objects” enthalten kann. Der Write-Behind Modus bietet zwei verschiedene Strategien der Feinkonfiguration (die allerdings nur bedingt verfügbar sind):

  1. Unscheduled Write-Behind Strategie
    Dieser Modus wird ab der Version 4.0 unterstützt und versucht, anstehende Änderungen parallel zu bearbeiten und sie dadurch so schnell wie möglich im CacheStore zu persistieren. Zu diesem Zweck gibt es mehrere auf Änderungen wartende Threads, die auftretende Änderungen in den jeweiligen CacheStore speichern. Dadurch lässt sich das Inkonsistenzzeitfenster zwischen Cacheinhalt und CacheStore sehr gering halten.
    Diese Strategie ist für CacheStores mit niedriger Latenz und geringem Betriebsoverhead geeignet, wie z.B. einem “local unshared filebased cache store”.

    <?xml version="1.0" encoding="UTF-8"?>
    <infinispan
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd"
          xmlns="urn:infinispan:config:6.0">
       <namedCache name="persistentCache">
          <persistence passivation="false">
             <singleFile fetchPersistentState="true"
                         ignoreModifications="false"
                         purgeOnStartup="false" location="${java.io.tmpdir}">
                <!-- write behind configuration starts here -->
                <async enabled="true"/>
                <!-- write behind configuration ends here -->
             </singleFile>
          </persistence>
       </namedCache>
    </infinispan>
    
  2. Scheduled Write-Behind Strategie
    Dieser Modus ist noch nicht implementiert.
    In diesem Modus wird Infinispan die Änderungen am Cache in periodischen Abständen in den CacheStore synchronisieren. Der Zeitslot der Synchronisierungsperiode soll in Sekunden, Minuten, Tagen usw. konfiguriert werden können.
Short URL for this post: https://wp.me/p4nxik-24t
This entry was posted in Java EE, Java Persistence, Java Runtimes - VM, Appserver & Cloud and tagged , , , , . Bookmark the permalink.

Leave a Reply