Anúncio

Caching mit Spring Boot - Pain & Gain @ JCON22

QAware GmbH
23 de Sep de 2022
Anúncio

Mais conteúdo relacionado

Similar a Caching mit Spring Boot - Pain & Gain @ JCON22(20)

Mais de QAware GmbH(20)

Anúncio

Último(20)

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
  4. Spring Cache Abstraction
  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>
  6. qaware/jcon22-spring-boot-caching
  7. Cache Poisoning
  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) … }
  11. Metriken, Metriken, Metriken
  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
  19. Beispiel QAware | 19
  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
  23. Bonus: @CollectionCachable
  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
Anúncio