CachingHintergründe, Patterns
&" Best Practices"für Business Anwendungen
Michael Plöd"Senacor Technologies AG
@bitboss
Business-Anwendung
!= Twitter / Facebook & co.
Cache"/ kæʃ /"bezeichnet in der EDV einen schnellen Puffer-Speicher, der (erneute) Zugriffe auf ein langsames Hintergrundmedium oder aufwändige Neuberechnungen zu vermeiden hilft. Inhalte/Daten, die bereits einmal beschafft/berechnet wurden, verbleiben im Cache, sodass sie bei späterem Bedarf schneller zur Verfügung stehen. Auch können Daten, die vermutlich bald benötigt werden, vorab vom Hintergrundmedium abgerufen und vorerst im Cache bereitgestellt werden.""Caches können als Hardware- oder Softwarestruktur ausgebildet sein. In ihnen werden Kopien zwischengespeichert.
Quelle: http://de.wikipedia.org/wiki/Cache
Caches everywhere!!!
NO WAY
Viele Enterprise Projekte haben Angst vor Caching……
"
…….. und setzen Caching deshalb insuffizient ein.
Mit dem richtigen Einsatz von Caching können
Business-Anwendungen skalierbarer, performanter und günstiger im Betrieb
werden.
Aufbau und Laufzeit-Verhalten einer typischen
Business-Anwendung
Web
HostSystem
X .. Y .. ZDB
Anwendungsfall
Host
System X .. Y .. Z
DB
Host-Services werden in der Regel pro Aufruf abgerechnet
Aufrufe von Umsystemen benötigen in der Regel viel Zeit
Datenbanken werden häufig aufgerufen
Geld
Zeit
Ressourcen
Zu teuer! Zu langsam!Schlechter
Service!
IT-Chef Betreuer Kunde
CACHESArten von
Orte für
Local Cache, Data Grid, Document Store, JPA First Level Cache, JPA Second Level Cache,
Hybrid Cache
Datenbank, Heap, HTTP Proxy, Browser, Prozessor, Disk, Off Heap, Persistenz-
Framework, Anwendung
Wir betrachten primär lokales und verteiltes
Caching auf Anwendungs-Ebene mit einem Exkurs in
Richtung JPA
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
1 Identifiziere geeignete Ebenen für Caching
BeschwerdeManagementRestController
BeschwerdeManagementBusinessService
DatenBeschaffungsManager
Host!Commands
Umsystem!Commands
JPA!DAO
HTTP Caching
Lese Operationen
Lese Operationen
Lese Operationen
Lese Operationen
Lese- und Schreib-
Operationen
Cache Ebenen
2 Bleibe so lange lokal wie möglich
Lokal In-Memory
JVM
Cache
ClusteredJVM
Cache
JVM
Cache
JVM
Cache
JVM
Cache
Demo Hazelcast lokal vs verteilt
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
Ein transaktionaler Cache kostet Performance!
JVM
JVM
JVM
JVM
Clustered - with sync
Cache
Cache
Cache
Cache
Invalidation
Replication
3 Ziehe Invalidation, Replication vor
Cache
Cache
Cache
Cache
Invalidation
Cache
Cache
Cache
Cache
Invalidation
#1PUT (Insert)
PUT (Insert)
#1
#1PUT (Insert)
PUT (Insert)
#1
Cache
Cache
Cache
Cache
Invalidation
#1 #1
#1#1
Cache
Cache
Cache
Cache
Invalidation
#1 #1
PUT (Update)
#1#1
Cache
Cache
Cache
Cache
Invalidation
PUT (Update)
#1
Cache
Cache
Cache
Cache
Replication
Cache
Cache
Cache
Cache
#1
#1 #1
Replication
#1PUT (Insert)
Cache
Cache
Cache
Cache
#1
#1 #1
Replication
#1
Cache
Cache
Cache
Cache
#1
#1 #1
Replication
#1 PUT (Update)
Bisher hält jeder Cache potentiell alle Daten
und belegt Platz im Heap
Big Heap
?
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
4 Vermeide große Heap-Sizes nur für Caching.
Grosser Heap führt zu langen
major GCs
Application Data
Cache
32 G
B
Lange GCs können Cluster destabilisieren
JVM
Cache
JVM
Cache
JVM
Cache
JVM
Cache
Lange GCs können Cluster destabilisieren
JVM
Cache
JVM
Cache
JVM
Cache
JVM
Cache
Lösung: Kleine Caches?
"
Viele Evictions, wenige Hits,
„hot data“ kann nicht entstehen
5 Sehr grosse Datenmenge? Distributed Cache!
Distributed CachesJVM
JVM JVM
JVM
Cache Node
1
Cache Node
2
Cache Node
3
Cache
1
Cache
1Kunde
#23Kunde
#30
Kunde #27
Kunde #32
Cache
1Kunde
#23Kunde
#30
Kunde #27
Kunde #32
2
1 2Kunde
#23Kunde
#30Kunde
#27Kunde
#32
Die Daten werden verteilt und Backups
gesichert
1 2Kunde
#23Kunde
#30Kunde
#27Kunde
#32
BACKUP #27
BACKUP #32
BACKUP #23
BACKUP #30
Die Daten werden verteilt und Backups
gesichert
3
1 2Kunde
#23
Kunde #30
Kunde #27
Kunde #32
BACKUP #27
BACKUP #32
BACKUP #23
BACKUP #30
43
1 2Kunde
#23
Kunde #30
Kunde #27
Kunde #32
BACKUP #27
BACKUP #32
BACKUP #23
BACKUP #30
DEMOHazelcast
on Raspberry Pi
in Lego
8 Raspberry Pis mit je einer
Hazelcast Instanz !
1 MacBook Pro mit zwei
Hazelcast Instanzen
Test Programme
Raspberry Hazelcast
Raspberry Hazelcast
Raspberry Hazelcast
Raspberry Hazelcast
Raspberry Hazelcast
Raspberry Hazelcast
Raspberry Hazelcast
Raspberry Hazelcast
Hazelcast
Hazelcast
MacBook Pro Lego Cloud
Hazelcast Cluster mit beliebig skalierbarer Anzahl an Instanzen
Ein verteilter Cache führt zu kleinen Heaps, mehr Kapazität und lässt sich einfach skalieren
Application Data
Cache
2 - 4
GB
… Cache
6 Der Operations-Mitarbeiter ist Dein bester Freund!
Caches im Cluster sind komplex
Betrieb mit an Board holen!
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
7 Cache nur geeignete Daten
Die besten Cache Kandidaten sind read-
mostly Daten, die teuer in der Beschaffung sind
Will man dennoch schreib-intensive Daten im Cluster cachen, dann nur mit dem Modus „distributed cache“
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
8 Nutze erprobte Cache-Implementierungen
NIEMALS eine eigene Cache Implementierung
entwickeln
CACHEImplementierungen
Infinispan, EHCache, Hazelcast, Couchbase, Memcache, OSCache, SwarmCache, Xtreme
Cache, Apache DirectMemory
Terracotta, Coherence, Gemfire, Cacheonix, WebSphere eXtreme Scale, Oracle 12c In
Memory Database
Was soll ich cachen?
Wo soll ich cachen?
Welchen Cache soll ich nutzen?
Welchen Einfluss hat das auf meine Infrastruktur?
Was muss ich in Bezug auf Datenkonsistenz beachten?
Wie führe ich Caching ein?
9 Führe Caching in drei Schritten ein
Anwendungs- Optimierung
Lokaler Cache Verteilter Cache
Performance Boost
Performance Slowdown
10 Optimiere die Serialisierung von Objekten
Demo Proprietäre
Serialisierungs-Möglichkeiten
Beispiel: Hazelcast 10.000 Objekte lokal schreiben und lesen
GET Time PUT Time Payload Size
Serializable 1287 ms 1220 ms 1164 byte
DataSerializable 443 ms 408 ms 916 byte
IdentifierData
Serializable264 ms 207 ms 882 byte
JAVA SERIALIZATIONSUCKS
for Caching if alternatives are present
11 Abstrahiere Deinen Cache Provider
<cache:annotation-driven cache-manager="ehCacheManager"/>!!<!-- EH Cache local -->!<bean id="ehCacheManager" ! class="org.springframework.cache.ehcache.EhCacheCacheManager"! p:cacheManager-ref="ehcache"/>!! !<bean id="ehcache" ! class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"!! p:configLocation="/ehcache.xml"/>
Beispiel: Spring
@Cacheable("CrmIntegrationService#retrieveCustomer")!public Customer retrieveCustomer(Long customerNumber) {!! …!}
Demo Kundensuche in Call-Center
User Interface
„CRM“
Kundendaten
„Host“ !
Konten Transaktionen
DB
Spring + Wicket
Spring Boot Java EE 7 H2 Server
Netzwerk
12Lagere „heisse Daten“ möglichst nah an der Anwendung
Beispiel: Near Cache
JVMCache Node
1
Cache Node
2
Cache Node
3
Cache Node
4
Cache Node
5
Cache Node
6
Beispiel: Near Cache
JVMCache Node
1
Cache Node
2
Cache Node
3
Cache Node
4
Cache Node
5
Cache Node
6
Cache Node
13Verwende Off-Heap Storage für Cache Instanzen mit mehr wie 4 GB Heap Size
THINK
BIG
Off Heap
30 G
B RA
MJVM
Cache Runtime
Cache Data
2 G
B H
EAP
Keine Garbage Collection
Sehr kurze Garbage Collections
14 JPA: Flush vor Cache Put
IMMER entityManager.flush()
VOR Cache Put
14 JPA: Flush vor Cache Put
13
12
11
10
9
8
7
6
5
4
3
2
1
Off-Heap Storage für Cache Instanzen mit mehr wie 4 GB Heap Size
Lagere „heisse Daten“ möglichst nah an der Anwendung
Abstrahiere Deinen Cache Provider
Optimiere die Serialisierung von Objekten
Führe Caching in drei Schritten ein
Nutze erprobte Cache-Implementierungen
Cache nur geeignete Daten
Der Operations-Mitarbeiter ist Dein bester Freund!
Sehr grosse Datenmenge? Distributed Cache!
Vermeide große Heap-Sizes nur für Caching.
Ziehe Invalidation, Replication vor
Bleibe so lange lokal wie möglich
Identifiziere geeignete Ebenen für Caching
Fragen?Michael Plöd"
Senacor Technologies AG"@bitboss"
http://slideshare.net/mploed"[email protected]"