SlideShare ist ein Scribd-Unternehmen logo
qaware.de
Caching mit Spring Boot: Pain & Gain
Dirk Kröhan
dirk.kroehan@qaware.de
QAware | 2
Zitat: Phil Karlton
QAware | 3
Dirk Kröhan
Software Architect
#qaware #mainz
#cloudnative
Spring Cache Abstraction
Spring Boot Caching on one Slide
QAware | 5
@Repository
@RequiredArgsConstructor
public class SpringDataConfigRepository implements ConfigRepository {
private final ConfigDbRepository configDbRepository;
@Override
@Cacheable(cacheNames = CacheConstants.CACHE_CONFIG, key = "#configId", unless = "#result == null")
public Config getConfig(ConfigId configId) {
return configDbRepository.findOneByConfigId(configId)
.map(this::mapToConfig).orElse(null);
}
@Override
@CachePut(cacheNames = CacheConstants.CACHE_CONFIG, key = "#configId")
public Config setConfig(ConfigId configId, Config config) {
…
}
}
@EnableCaching
@Configuration
public class CachingConfiguration {
…
}
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
</dependencies>
qaware/jcon22-spring-boot-caching
Cache Poisoning
Vorsicht bei Änderungen an Klassen
QAware | 8
Cluster
my-service
v2
my-service
v1
Load
Balancer
Cache PUT
Serialized Object v2
Cache GET
Expect Object v1
■ Performance Tweak: Pre-Register zu cachende Klassen
– Kryo speichert dann nur einen int Wert für jede Klasse
■ Achtung: Reihenfolge der Klassen muss immer gleich bleiben -> List statt Set
– Hinzufügen von neuen Klassen nur ans Ende der Liste
■ Bei Missachtung: Wilde Exceptions nach Deployment
– z.B.: Kryo versucht Objekt A zu deserialisieren, obwohl Objekt B angefragt wird
Kryo pre-registered classes
QAware | 9
protected KryoSerDes create() {
Kryo kryo = new Kryo();
KRYO_REGISTERED_CLASSES.forEach(kryo::register);
■ Cache-Prefix das vom Deployment abhängt
– z.B. Environment Variable, die eine Application Property überschreibt
– siehe:
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.exter
nal-config
■ Nachteil: Cold Cache nach einem Deployment
– Canary deployment wärmt den Cache vor
Lösung
QAware | 10
private RedisCacheConfiguration getDefaultCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(cacheName -> redisCachingConfigurationProperties.getCachePrefix() + cacheName)
…
}
Metriken, Metriken, Metriken
Metriken das Must-Have!
QAware | 12
■ Klassische Cache Metriken: Hit-/Miss-Rate
■ Für uns speziell relevant: Metriken zur Latenz
– Separate Metriken für Cache Hit/Miss/Put/Evict
– Am besten direkt als RED-Metric (Rate, Error, Duration)
■ Dedizierte Metriken für spezielle Usecases
– Wie viele Cache / DB Zugriffe für Usecase X
– Summe der Cache / DB Latenzen für Usecase X
• RequestScope Beans als Datencollector
Beispiel: Klassische Cache Metriken
QAware | 13
Beispiel: Metriken zur Cache Latenz
QAware | 14
Beispiel: Metriken pro Usecase
QAware | 15
Beispiel: DB Call duration
QAware | 16
Beispiel: DB Call duration
QAware | 17
QAware | 18
“Ohne Observability in Production?
Haha, am Arsch!”
-- Ein Kollege der namentlich nicht genannt werden möchte
Beispiel
QAware | 19
Beispiel: Plötzliche Verdopplung der Latenz
QAware | 20
Recap
Was haben wir gelernt?
QAware | 22
■ Lokale Caches
– Schnell und einfach eingebaut
– Dateninkonsistenz bei > 1 Instanz
• Reduzieren durch passende TTLs
■ Distributed Caching mit Spring Data Redis
– Umstieg kaum Aufwand: Dependency austauschen + CacheManager konfigurieren
– Aber: Objekt (De-)Serialisierung ist jetzt zu beachten
■ Unzuverlässiges Netzwerk
– Resilient Cache Manager: Circuit Breaker um den Cache packen
■ Cache Poisoning
– Konfigurierbarer Cache-Prefix bei Bedarf setzen
– oder automatisiert im Deployment
■ Metriken
– In der Praxis geht es einfach nicht ohne!
– Keine Metriken = Blindflug
Bonus: @CollectionCachable
Wie geht das denn?
QAware | 24
■ Siehe: https://github.com/qaware/collection-cacheable-for-spring
class MyRepository {
@Nullable
@Cacheable(cacheNames = "myCache", unless = "#result == null")
MyEntity findById(long id) {
// retrieve one MyEntity from persistence layer (if existing)
}
@CollectionCacheable(cacheNames = "myCache")
Map<Long, MyEntity> findByIds(Collection<Long> ids) {
// do efficient batch retrieve of many MyEntity's and build result map
}
}
qaware.de
QAware GmbH Mainz
Rheinstraße 4 C
55116 Mainz
Tel. +49 6131 21569-0
info@qaware.de
twitter.com/qaware
linkedin.com/company/qaware-gmbh
xing.com/companies/qawaregmbh
slideshare.net/qaware
github.com/qaware

Weitere ähnliche Inhalte

Ähnlich wie Caching mit Spring Boot - Pain & Gain @ JCON22

Infrastructure as Code mit Terraform
Infrastructure as Code mit TerraformInfrastructure as Code mit Terraform
Infrastructure as Code mit Terraform
Harald Schmaldienst
 
A Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackA Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native Stack
QAware GmbH
 
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfA Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
Mario-Leander Reimer
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
SpeedPartner GmbH
 
Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...
Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...
Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...
OPITZ CONSULTING Deutschland
 
Bitrix Site Manager v11.0 Presentation (de)
Bitrix Site Manager v11.0 Presentation (de)Bitrix Site Manager v11.0 Presentation (de)
Bitrix Site Manager v11.0 Presentation (de)
Bitrix, Inc.
 
Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...
Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...
Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...
Loopback.ORG
 
Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...
Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...
Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...
AWS Germany
 
Presentation bp7 - citrix xen desktop
Presentation   bp7 - citrix xen desktopPresentation   bp7 - citrix xen desktop
Presentation bp7 - citrix xen desktop
xKinAnx
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der Cloud
AOE
 
LAIK: A Library for Fault Tolerant Distribution of Global Data
LAIK: A Library for Fault Tolerant Distribution of Global DataLAIK: A Library for Fault Tolerant Distribution of Global Data
LAIK: A Library for Fault Tolerant Distribution of Global Data
Dai Yang
 
Geoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GIS
Geoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GISGeoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GIS
Geoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GIS
Peter Löwe
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
Patrick Paechnatz
 
Big Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im Überblick
Big Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im ÜberblickBig Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im Überblick
Big Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im Überblick
Karin Patenge
 
Best Practices 
Java und JVM in Containern
Best Practices 
Java und JVM in ContainernBest Practices 
Java und JVM in Containern
Best Practices 
Java und JVM in Containern
OPITZ CONSULTING Deutschland
 
Die Containerplattform Lego für DevOps
Die Containerplattform Lego für DevOpsDie Containerplattform Lego für DevOps
Die Containerplattform Lego für DevOps
ATIX AG
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit Microservices
QAware GmbH
 
Node.js
Node.jsNode.js
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
AOE
 

Ähnlich wie Caching mit Spring Boot - Pain & Gain @ JCON22 (20)

Infrastructure as Code mit Terraform
Infrastructure as Code mit TerraformInfrastructure as Code mit Terraform
Infrastructure as Code mit Terraform
 
Query Result Caching
Query Result CachingQuery Result Caching
Query Result Caching
 
A Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackA Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native Stack
 
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConfA Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...
Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...
Schlaglichter Oracle DB 11gR2 - DOAG Regio-Treffen 2010 - OPITZ CONSULTING - ...
 
Bitrix Site Manager v11.0 Presentation (de)
Bitrix Site Manager v11.0 Presentation (de)Bitrix Site Manager v11.0 Presentation (de)
Bitrix Site Manager v11.0 Presentation (de)
 
Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...
Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...
Klonen von Exadata-Datenbanken mit der Oracle ZFS Appliance - Ein Erfahrungsb...
 
Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...
Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...
Webinar Neues von der re:invent 2013 Teil 1: PostgreSQL RDS, CloudTrail, neue...
 
Presentation bp7 - citrix xen desktop
Presentation   bp7 - citrix xen desktopPresentation   bp7 - citrix xen desktop
Presentation bp7 - citrix xen desktop
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der Cloud
 
LAIK: A Library for Fault Tolerant Distribution of Global Data
LAIK: A Library for Fault Tolerant Distribution of Global DataLAIK: A Library for Fault Tolerant Distribution of Global Data
LAIK: A Library for Fault Tolerant Distribution of Global Data
 
Geoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GIS
Geoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GISGeoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GIS
Geoinformatik-Kolloquium Juni 2012: High Performance Computing Cluster GIS
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
Big Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im Überblick
Big Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im ÜberblickBig Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im Überblick
Big Data Community Webinar vom 16. Mai 2019: Oracle NoSQL DB im Überblick
 
Best Practices 
Java und JVM in Containern
Best Practices 
Java und JVM in ContainernBest Practices 
Java und JVM in Containern
Best Practices 
Java und JVM in Containern
 
Die Containerplattform Lego für DevOps
Die Containerplattform Lego für DevOpsDie Containerplattform Lego für DevOps
Die Containerplattform Lego für DevOps
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit Microservices
 
Node.js
Node.jsNode.js
Node.js
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 

Mehr von QAware GmbH

Frontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdfFrontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdf
QAware GmbH
 
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
QAware GmbH
 
50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
QAware GmbH
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
QAware GmbH
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
QAware GmbH
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
QAware GmbH
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
QAware GmbH
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
QAware GmbH
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
QAware GmbH
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
QAware GmbH
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
QAware GmbH
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
QAware GmbH
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
QAware GmbH
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
QAware GmbH
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
QAware GmbH
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
QAware GmbH
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
QAware GmbH
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
QAware GmbH
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
QAware GmbH
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
QAware GmbH
 

Mehr von QAware GmbH (20)

Frontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdfFrontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdf
 
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
 
50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
 

Caching mit Spring Boot - Pain & Gain @ JCON22

  • 1. qaware.de Caching mit Spring Boot: Pain & Gain Dirk Kröhan dirk.kroehan@qaware.de
  • 2. QAware | 2 Zitat: Phil Karlton
  • 3. QAware | 3 Dirk Kröhan Software Architect #qaware #mainz #cloudnative
  • 5. Spring Boot Caching on one Slide QAware | 5 @Repository @RequiredArgsConstructor public class SpringDataConfigRepository implements ConfigRepository { private final ConfigDbRepository configDbRepository; @Override @Cacheable(cacheNames = CacheConstants.CACHE_CONFIG, key = "#configId", unless = "#result == null") public Config getConfig(ConfigId configId) { return configDbRepository.findOneByConfigId(configId) .map(this::mapToConfig).orElse(null); } @Override @CachePut(cacheNames = CacheConstants.CACHE_CONFIG, key = "#configId") public Config setConfig(ConfigId configId, Config config) { … } } @EnableCaching @Configuration public class CachingConfiguration { … } <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> </dependencies>
  • 8. Vorsicht bei Änderungen an Klassen QAware | 8 Cluster my-service v2 my-service v1 Load Balancer Cache PUT Serialized Object v2 Cache GET Expect Object v1
  • 9. ■ Performance Tweak: Pre-Register zu cachende Klassen – Kryo speichert dann nur einen int Wert für jede Klasse ■ Achtung: Reihenfolge der Klassen muss immer gleich bleiben -> List statt Set – Hinzufügen von neuen Klassen nur ans Ende der Liste ■ Bei Missachtung: Wilde Exceptions nach Deployment – z.B.: Kryo versucht Objekt A zu deserialisieren, obwohl Objekt B angefragt wird Kryo pre-registered classes QAware | 9 protected KryoSerDes create() { Kryo kryo = new Kryo(); KRYO_REGISTERED_CLASSES.forEach(kryo::register);
  • 10. ■ Cache-Prefix das vom Deployment abhängt – z.B. Environment Variable, die eine Application Property überschreibt – siehe: https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.exter nal-config ■ Nachteil: Cold Cache nach einem Deployment – Canary deployment wärmt den Cache vor Lösung QAware | 10 private RedisCacheConfiguration getDefaultCacheConfiguration() { return RedisCacheConfiguration.defaultCacheConfig() .computePrefixWith(cacheName -> redisCachingConfigurationProperties.getCachePrefix() + cacheName) … }
  • 12. Metriken das Must-Have! QAware | 12 ■ Klassische Cache Metriken: Hit-/Miss-Rate ■ Für uns speziell relevant: Metriken zur Latenz – Separate Metriken für Cache Hit/Miss/Put/Evict – Am besten direkt als RED-Metric (Rate, Error, Duration) ■ Dedizierte Metriken für spezielle Usecases – Wie viele Cache / DB Zugriffe für Usecase X – Summe der Cache / DB Latenzen für Usecase X • RequestScope Beans als Datencollector
  • 13. Beispiel: Klassische Cache Metriken QAware | 13
  • 14. Beispiel: Metriken zur Cache Latenz QAware | 14
  • 15. Beispiel: Metriken pro Usecase QAware | 15
  • 16. Beispiel: DB Call duration QAware | 16
  • 17. Beispiel: DB Call duration QAware | 17
  • 18. QAware | 18 “Ohne Observability in Production? Haha, am Arsch!” -- Ein Kollege der namentlich nicht genannt werden möchte
  • 20. Beispiel: Plötzliche Verdopplung der Latenz QAware | 20
  • 21. Recap
  • 22. Was haben wir gelernt? QAware | 22 ■ Lokale Caches – Schnell und einfach eingebaut – Dateninkonsistenz bei > 1 Instanz • Reduzieren durch passende TTLs ■ Distributed Caching mit Spring Data Redis – Umstieg kaum Aufwand: Dependency austauschen + CacheManager konfigurieren – Aber: Objekt (De-)Serialisierung ist jetzt zu beachten ■ Unzuverlässiges Netzwerk – Resilient Cache Manager: Circuit Breaker um den Cache packen ■ Cache Poisoning – Konfigurierbarer Cache-Prefix bei Bedarf setzen – oder automatisiert im Deployment ■ Metriken – In der Praxis geht es einfach nicht ohne! – Keine Metriken = Blindflug
  • 24. Wie geht das denn? QAware | 24 ■ Siehe: https://github.com/qaware/collection-cacheable-for-spring class MyRepository { @Nullable @Cacheable(cacheNames = "myCache", unless = "#result == null") MyEntity findById(long id) { // retrieve one MyEntity from persistence layer (if existing) } @CollectionCacheable(cacheNames = "myCache") Map<Long, MyEntity> findByIds(Collection<Long> ids) { // do efficient batch retrieve of many MyEntity's and build result map } }
  • 25. qaware.de QAware GmbH Mainz Rheinstraße 4 C 55116 Mainz Tel. +49 6131 21569-0 info@qaware.de twitter.com/qaware linkedin.com/company/qaware-gmbh xing.com/companies/qawaregmbh slideshare.net/qaware github.com/qaware