SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
qaware.de
Title is loading... Cache is cold
Low latency as requirement
Dirk Kröhan
dirk.kroehan@qaware.de
QAware | 2
Zitat: Phil Karlton
QAware | 3
Dirk Kröhan
Software Architect
#qaware #mainz
#cloudnative
Low latency as requirement
Kontext: Sprachverarbeitung
QAware | 5
Verarbeitung von Audio in einer dynamisch
konfigurierbaren Pipeline
■ Konfiguration persistent in Datenbank
■ Multi-Tenant
■ User-based settings
■ Verarbeitung abhängig vom jeweiligen
Request
■ Requirement: Low additional Latency
Kontext: Sprachverarbeitung
QAware | 6
API
Backend
DB
Dynamische Verarbeitungs-Pipeline
Spring Cache Abstraction
Spring Boot Caching on one Slide
QAware | 8
@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>
From Local Cache to Distributed
Cache
Local Caches
QAware | 10
Cluster
my-service
Local Cache
DB
Let’s test it!
Local Caches
QAware | 11
Cluster
my-service
Local Cache
DB
GET /my-service/api/config
Cache Miss
30ms
Local Caches
QAware | 12
Cluster
my-service
Local Cache
DB
GET /my-service/api/config 30 ms
GET /my-service/api/config
Cache Hit
5ms
Local Caches
QAware | 13
Let’s scale!!
Cluster
my-service
Local Cache
my-service
Local Cache
my-service
Local Cache
Load
Balancer
DB
Local Caches
QAware | 14
Cluster
my-service
Local Cache
my-service
Local Cache
my-service
Local Cache
Load
Balancer
DB
GET /my-service/api/config
PUT /my-service/api/config
DELETE /my-service/api/config
Cache Inkonsistenz
Spring Cache Redis
QAware | 15
@Configuration
@EnableCaching
@ConditionalOnProperty(name = "features.distributed-cache", havingValue = "true")
@RequiredArgsConstructor
public class CachingConfiguration {
private final RedisCachingConfigurationProperties redisCachingConfigurationProperties;
@Bean
public CacheManager redisCacheManager() {
return RedisConnectionFactoryBuilder.build(redisCachingConfigurationProperties).create();
}
}
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
</dependencies>
Welcome on Stage: NotSerializableException 😱
Vorher hat unser Local Cache einfach Referenzen auf die Java Objekte gehalten, jetzt müssen wir uns
plötzlich um Objekt Serialisierung kümmern… 😒
Mögliche Lösungen:
■ Zu cachende Objekte implementieren Serializable
■ RedisCacheConfiguration -> serializeKeysWith / serializeValuesWith
– serializeKeysWith -> StringRedisSerializer
– serializeValuesWith -> Your Choice!
• Jackson (GenericJackson2JsonRedisSerializer)
• Kryo (Custom RedisSerializer)
❭ https://github.com/EsotericSoftware/kryo
• …
QAware | 16
Resilient Cache Manager
Unreliable network
QAware | 18
■ Verbindungsabbrüche zum Cache
■ Applikation startet nicht, wenn Verbindung zu Redis nicht möglich ist
■ Lettuce (Redis client) -> Hoher default Timeout
■ Langsame Cache Zugriffe -> Timeouts
Lösung: Fail fast!
1. Netzwerk Probleme erkennen
2. Cache durch No-Op/In-Memory ersetzen
3. Asynchron im Hintergrund die Verbindung neu aufbauen
Dafür gibt es doch schon etwas: Circuit Breaker
QAware | 19
my-service
Circuit-Breaker
Half-
Open
Closed
Open
Complex Logic
Tipp: Verschieden Circuit-Breaker je Cache Operation
■ Z.B. geringere Timeouts für Cache GET
Cache Poisoning
Deploying a new version
QAware | 21
Cluster
my-service
v2
my-service
v1
Load
Balancer
Cache PUT
Serialized Object v2
Cache GET
Expect Object v1
Vorsicht bei Änderungen an Klassen, die gecached werden!
■ 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 | 22
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 | 23
private RedisCacheConfiguration getDefaultCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(cacheName -> redisCachingConfigurationProperties.getCachePrefix() + cacheName)
…
}
Metrics, Metrics, Metrics
Metriken das Must-Have!
QAware | 25
■ 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 | 26
Beispiel: Metriken zur Cache Latenz
QAware | 27
Beispiel: Metriken pro Usecase
QAware | 28
Beispiel: DB Call duration
QAware | 29
Beispiel: DB Call duration
QAware | 30
QAware | 31
“Ohne Observability in Production?
Haha, am Arsch!”
-- Ein Kollege der namentlich nicht genannt werden möchte
Beispiel
QAware | 32
Beispiel: Plötzliche Verdopplung der Latenz
QAware | 33
Recap
Was haben wir gelernt?
QAware | 35
■ Local 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 ein Thema
■ Unreliable network
– Resilient Cache Manager: Circuit Breaker um den Cache packen
■ Cache Poisoning
– Konfigurierbarer Cache-Prefix bei Bedarf setzen
– oder automatisiert im Deployment
■ Metrics
– In der Praxis geht es einfach nicht ohne!
– Keine Metriken = Blindflug
QAware | 36
Also ich hab
voll viel gelernt!
KOMM ZU UNS! Stand #208
■ Genieße einen Cloud Fitness Espresso mit uns.
■ gRPC vs. REST
Sei bei unserem Cloud Native Battle dabei.
■ Gewinne 1 von 10 Cloud Native Nerd Swag-Paketen.
qaware.de
QAware GmbH
Aschauer Straße 32
81549 München
Tel. +49 89 232315-0
info@qaware.de
twitter.com/qaware
linkedin.com/company/qaware-gmbh
xing.com/companies/qawaregmbh
slideshare.net/qaware
github.com/qaware
Bonus: @CollectionCachable
Wie geht das denn?
QAware | 40
■ 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
}
}

Weitere ähnliche Inhalte

Was ist angesagt?

Leveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkLeveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkQAware GmbH
 
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickelnDie Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickelnQAware GmbH
 
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.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. #ContainerConfMario-Leander Reimer
 
Ceph Introduction @GPN15
Ceph Introduction @GPN15Ceph Introduction @GPN15
Ceph Introduction @GPN15m1no
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturQAware GmbH
 
Enterprise Cloud Native ist das neue Normal
Enterprise Cloud Native ist das neue NormalEnterprise Cloud Native ist das neue Normal
Enterprise Cloud Native ist das neue NormalQAware GmbH
 
Per Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API GatewaysPer Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API GatewaysQAware GmbH
 
Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014
Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014
Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014inovex GmbH
 
Tipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerTipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerNicholas Dille
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsQAware GmbH
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsJosef Adersberger
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinStephan Kaps
 
openstack Übersicht @GPN15
openstack Übersicht @GPN15openstack Übersicht @GPN15
openstack Übersicht @GPN15m1no
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHagilemethoden
 
Mit OpenStack zur eigenen Cloud (OSDC 2012)
Mit OpenStack zur eigenen Cloud (OSDC 2012)Mit OpenStack zur eigenen Cloud (OSDC 2012)
Mit OpenStack zur eigenen Cloud (OSDC 2012)hastexo
 
Infrastructure as code: Cloud-Umgebungen mit Terraform verwalten
Infrastructure as code: Cloud-Umgebungen mit Terraform verwaltenInfrastructure as code: Cloud-Umgebungen mit Terraform verwalten
Infrastructure as code: Cloud-Umgebungen mit Terraform verwalteninovex GmbH
 

Was ist angesagt? (20)

Leveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkLeveraging the Power of Solr with Spark
Leveraging the Power of Solr with Spark
 
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickelnDie Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
Die Leichtigkeit des Seins: Bindings für Eclipse SmartHome entwickeln
 
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.Steinzeit war gestern! Wege der Cloud-nativen Evolution.
Steinzeit war gestern! Wege der Cloud-nativen Evolution.
 
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
 
Nginx
NginxNginx
Nginx
 
Ceph Introduction @GPN15
Ceph Introduction @GPN15Ceph Introduction @GPN15
Ceph Introduction @GPN15
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
 
Enterprise Cloud Native ist das neue Normal
Enterprise Cloud Native ist das neue NormalEnterprise Cloud Native ist das neue Normal
Enterprise Cloud Native ist das neue Normal
 
Per Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API GatewaysPer Anhalter zu Cloud-nativen API Gateways
Per Anhalter zu Cloud-nativen API Gateways
 
systemd & Docker
systemd & Dockersystemd & Docker
systemd & Docker
 
Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014
Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014
Keepalived & HA-Proxy as an alternative to commercial loadbalancer - August 2014
 
Tipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit DockerTipps und Tricks im Umgang mit Docker
Tipps und Tricks im Umgang mit Docker
 
Dockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloudDockerize It - Mit apex in die amazon cloud
Dockerize It - Mit apex in die amazon cloud
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Docker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-PatternsDocker und Kubernetes Patterns & Anti-Patterns
Docker und Kubernetes Patterns & Anti-Patterns
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes sein
 
openstack Übersicht @GPN15
openstack Übersicht @GPN15openstack Übersicht @GPN15
openstack Übersicht @GPN15
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
 
Mit OpenStack zur eigenen Cloud (OSDC 2012)
Mit OpenStack zur eigenen Cloud (OSDC 2012)Mit OpenStack zur eigenen Cloud (OSDC 2012)
Mit OpenStack zur eigenen Cloud (OSDC 2012)
 
Infrastructure as code: Cloud-Umgebungen mit Terraform verwalten
Infrastructure as code: Cloud-Umgebungen mit Terraform verwaltenInfrastructure as code: Cloud-Umgebungen mit Terraform verwalten
Infrastructure as code: Cloud-Umgebungen mit Terraform verwalten
 

Ähnlich wie Title is loading ... Cache is cold.

Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22QAware GmbH
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbargedoplan
 
Apache Cassandra - Einführung
Apache Cassandra - EinführungApache Cassandra - Einführung
Apache Cassandra - EinführungAndreas Finke
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusOPEN KNOWLEDGE GmbH
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
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.
 
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 CloudAOE
 
K8s-native Daten-Pipelines mit Argo Workflows und Events
K8s-native Daten-Pipelines mit Argo Workflows und EventsK8s-native Daten-Pipelines mit Argo Workflows und Events
K8s-native Daten-Pipelines mit Argo Workflows und EventsQAware GmbH
 
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfSyahri Ramadhan
 
Drupal 7 auf Amazon Web Services
Drupal 7 auf Amazon Web ServicesDrupal 7 auf Amazon Web Services
Drupal 7 auf Amazon Web ServicesSven Paulus
 
Realtime BigData Step by Step mit Lambda, Kafka, Storm und Hadoop
Realtime BigData Step by Step mit Lambda, Kafka, Storm und HadoopRealtime BigData Step by Step mit Lambda, Kafka, Storm und Hadoop
Realtime BigData Step by Step mit Lambda, Kafka, Storm und HadoopValentin Zacharias
 
DB2 High Availability für IBM Connections, Sametime oder Traveler
DB2 High Availability für IBM Connections, Sametime oder TravelerDB2 High Availability für IBM Connections, Sametime oder Traveler
DB2 High Availability für IBM Connections, Sametime oder TravelerNico Meisenzahl
 
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
 
IPv6 Integration im Datacenter - wie komplex ist es wirklich?
IPv6 Integration im Datacenter - wie komplex ist es wirklich?IPv6 Integration im Datacenter - wie komplex ist es wirklich?
IPv6 Integration im Datacenter - wie komplex ist es wirklich?Swiss IPv6 Council
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenLenz Grimmer
 
Ausgewählte Performance Technologien
Ausgewählte Performance TechnologienAusgewählte Performance Technologien
Ausgewählte Performance Technologienoraclebudb
 

Ähnlich wie Title is loading ... Cache is cold. (20)

Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22
 
Query Result Caching
Query Result CachingQuery Result Caching
Query Result Caching
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbar
 
Apache Cassandra - Einführung
Apache Cassandra - EinführungApache Cassandra - Einführung
Apache Cassandra - Einführung
 
Datenbankoptimierung
DatenbankoptimierungDatenbankoptimierung
Datenbankoptimierung
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: Quarkus
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
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)
 
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
 
K8s-native Daten-Pipelines mit Argo Workflows und Events
K8s-native Daten-Pipelines mit Argo Workflows und EventsK8s-native Daten-Pipelines mit Argo Workflows und Events
K8s-native Daten-Pipelines mit Argo Workflows und Events
 
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdfDockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf
 
Drupal 7 auf Amazon Web Services
Drupal 7 auf Amazon Web ServicesDrupal 7 auf Amazon Web Services
Drupal 7 auf Amazon Web Services
 
Realtime BigData Step by Step mit Lambda, Kafka, Storm und Hadoop
Realtime BigData Step by Step mit Lambda, Kafka, Storm und HadoopRealtime BigData Step by Step mit Lambda, Kafka, Storm und Hadoop
Realtime BigData Step by Step mit Lambda, Kafka, Storm und Hadoop
 
DB2 High Availability für IBM Connections, Sametime oder Traveler
DB2 High Availability für IBM Connections, Sametime oder TravelerDB2 High Availability für IBM Connections, Sametime oder Traveler
DB2 High Availability für IBM Connections, Sametime oder Traveler
 
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...
 
IPv6 Integration im Datacenter - wie komplex ist es wirklich?
IPv6 Integration im Datacenter - wie komplex ist es wirklich?IPv6 Integration im Datacenter - wie komplex ist es wirklich?
IPv6 Integration im Datacenter - wie komplex ist es wirklich?
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL Hochverfügbarkeitslösungen
 
Ausgewählte Performance Technologien
Ausgewählte Performance TechnologienAusgewählte Performance Technologien
Ausgewählte Performance Technologien
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
NoSQL CGN: Riak (01/2012)
NoSQL CGN: Riak (01/2012)NoSQL CGN: Riak (01/2012)
NoSQL CGN: Riak (01/2012)
 

Mehr von 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.pdfQAware 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 MainzQAware 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 ArchitectureQAware 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 EngineeringQAware 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 PlaywrightQAware GmbH
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAsQAware 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 AutoscalingQAware 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 ZAPQAware 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 AutoscalingQAware 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
 
Per Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysQAware 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
 

Mehr von QAware GmbH (20)

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.
 
Per Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API Gateways
 
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
 

Title is loading ... Cache is cold.

  • 1. qaware.de Title is loading... Cache is cold Low latency as requirement Dirk Kröhan dirk.kroehan@qaware.de
  • 2. QAware | 2 Zitat: Phil Karlton
  • 3. QAware | 3 Dirk Kröhan Software Architect #qaware #mainz #cloudnative
  • 4. Low latency as requirement
  • 5. Kontext: Sprachverarbeitung QAware | 5 Verarbeitung von Audio in einer dynamisch konfigurierbaren Pipeline ■ Konfiguration persistent in Datenbank ■ Multi-Tenant ■ User-based settings ■ Verarbeitung abhängig vom jeweiligen Request ■ Requirement: Low additional Latency
  • 6. Kontext: Sprachverarbeitung QAware | 6 API Backend DB Dynamische Verarbeitungs-Pipeline
  • 8. Spring Boot Caching on one Slide QAware | 8 @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>
  • 9. From Local Cache to Distributed Cache
  • 10. Local Caches QAware | 10 Cluster my-service Local Cache DB Let’s test it!
  • 11. Local Caches QAware | 11 Cluster my-service Local Cache DB GET /my-service/api/config Cache Miss 30ms
  • 12. Local Caches QAware | 12 Cluster my-service Local Cache DB GET /my-service/api/config 30 ms GET /my-service/api/config Cache Hit 5ms
  • 13. Local Caches QAware | 13 Let’s scale!! Cluster my-service Local Cache my-service Local Cache my-service Local Cache Load Balancer DB
  • 14. Local Caches QAware | 14 Cluster my-service Local Cache my-service Local Cache my-service Local Cache Load Balancer DB GET /my-service/api/config PUT /my-service/api/config DELETE /my-service/api/config Cache Inkonsistenz
  • 15. Spring Cache Redis QAware | 15 @Configuration @EnableCaching @ConditionalOnProperty(name = "features.distributed-cache", havingValue = "true") @RequiredArgsConstructor public class CachingConfiguration { private final RedisCachingConfigurationProperties redisCachingConfigurationProperties; @Bean public CacheManager redisCacheManager() { return RedisConnectionFactoryBuilder.build(redisCachingConfigurationProperties).create(); } } <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency> </dependencies>
  • 16. Welcome on Stage: NotSerializableException 😱 Vorher hat unser Local Cache einfach Referenzen auf die Java Objekte gehalten, jetzt müssen wir uns plötzlich um Objekt Serialisierung kümmern… 😒 Mögliche Lösungen: ■ Zu cachende Objekte implementieren Serializable ■ RedisCacheConfiguration -> serializeKeysWith / serializeValuesWith – serializeKeysWith -> StringRedisSerializer – serializeValuesWith -> Your Choice! • Jackson (GenericJackson2JsonRedisSerializer) • Kryo (Custom RedisSerializer) ❭ https://github.com/EsotericSoftware/kryo • … QAware | 16
  • 18. Unreliable network QAware | 18 ■ Verbindungsabbrüche zum Cache ■ Applikation startet nicht, wenn Verbindung zu Redis nicht möglich ist ■ Lettuce (Redis client) -> Hoher default Timeout ■ Langsame Cache Zugriffe -> Timeouts Lösung: Fail fast! 1. Netzwerk Probleme erkennen 2. Cache durch No-Op/In-Memory ersetzen 3. Asynchron im Hintergrund die Verbindung neu aufbauen
  • 19. Dafür gibt es doch schon etwas: Circuit Breaker QAware | 19 my-service Circuit-Breaker Half- Open Closed Open Complex Logic Tipp: Verschieden Circuit-Breaker je Cache Operation ■ Z.B. geringere Timeouts für Cache GET
  • 21. Deploying a new version QAware | 21 Cluster my-service v2 my-service v1 Load Balancer Cache PUT Serialized Object v2 Cache GET Expect Object v1 Vorsicht bei Änderungen an Klassen, die gecached werden!
  • 22. ■ 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 | 22 protected KryoSerDes create() { Kryo kryo = new Kryo(); KRYO_REGISTERED_CLASSES.forEach(kryo::register);
  • 23. ■ 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 | 23 private RedisCacheConfiguration getDefaultCacheConfiguration() { return RedisCacheConfiguration.defaultCacheConfig() .computePrefixWith(cacheName -> redisCachingConfigurationProperties.getCachePrefix() + cacheName) … }
  • 25. Metriken das Must-Have! QAware | 25 ■ 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
  • 26. Beispiel: Klassische Cache Metriken QAware | 26
  • 27. Beispiel: Metriken zur Cache Latenz QAware | 27
  • 28. Beispiel: Metriken pro Usecase QAware | 28
  • 29. Beispiel: DB Call duration QAware | 29
  • 30. Beispiel: DB Call duration QAware | 30
  • 31. QAware | 31 “Ohne Observability in Production? Haha, am Arsch!” -- Ein Kollege der namentlich nicht genannt werden möchte
  • 33. Beispiel: Plötzliche Verdopplung der Latenz QAware | 33
  • 34. Recap
  • 35. Was haben wir gelernt? QAware | 35 ■ Local 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 ein Thema ■ Unreliable network – Resilient Cache Manager: Circuit Breaker um den Cache packen ■ Cache Poisoning – Konfigurierbarer Cache-Prefix bei Bedarf setzen – oder automatisiert im Deployment ■ Metrics – In der Praxis geht es einfach nicht ohne! – Keine Metriken = Blindflug
  • 36. QAware | 36 Also ich hab voll viel gelernt!
  • 37. KOMM ZU UNS! Stand #208 ■ Genieße einen Cloud Fitness Espresso mit uns. ■ gRPC vs. REST Sei bei unserem Cloud Native Battle dabei. ■ Gewinne 1 von 10 Cloud Native Nerd Swag-Paketen.
  • 38. qaware.de QAware GmbH Aschauer Straße 32 81549 München Tel. +49 89 232315-0 info@qaware.de twitter.com/qaware linkedin.com/company/qaware-gmbh xing.com/companies/qawaregmbh slideshare.net/qaware github.com/qaware
  • 40. Wie geht das denn? QAware | 40 ■ 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 } }