SlideShare a Scribd company logo
Database backed Coherence cache
             Tips, Tricks and Patterns




                        Alexey Ragozin
            alexey.ragozin@gmail.com
                             May 2012
Power of read-write-backing-map

 •   Fetching data as needed
 •   Separation of concerns
 •   Gracefully handling concurrency
 •   Write-behind – removing DB from critical path
 •   Database operation bundling
… and challenges

 DB operations are order of magnitude slower
  • Less deterministic response time
  • Coherence thread pools issues
 How verify persistence with write behind?
 Data are written in DB in random order
 read-write-backing-map and expiry
TIPS
BinaryEntryStore, did you know?

 BinaryEntryStore – an alternative to
 CacheLoader / CacheStore interface.
 Works with BinaryEntry instead of objects.

  You can access binary key and value
    • Skip deserialization, if binary is enough
  You can access previous version of value
    • Distinguish inserts vs. updates
    • Find which fields were cached
  You cannot set entry TTL in cache loader 
When storeAll(…) is called?

 cache.getAll(…)
 • loadAll(…) will be called with partition granularity
   (since Coherence 3.7)
 cache.putAll(…)
 • write-behind scheme will use storeAll(…)
 • write-through scheme will use store(…)
   (this could be really slow)
When storeAll(…) is called?

 cache.invokeAll(…)/aggregate(…)
 • calling get() on entry will invoke load(…)
   (if entry is not cached yet)
 • calling set() on entry will invoke put(…)
   (in case of write-through)
 • you can check entry.isPresent() to avoid needless
   read-through
 • Coherence will never use bulk cache store
   operations for aggregators and entry processors
Warming up aggregator

public static void preloadValuesViaReadThrough(Set<BinaryEntry> entries) {
  CacheMap backingMap = null;
  Set<Object> keys = new HashSet<Object>();
  for (BinaryEntry entry : entries) {
    if (backingMap == null) {
      backingMap = (CacheMap) entry.getBackingMapContext().getBackingMap();
    }
    if (!entry.isPresent()) {
      keys.add(entry.getBinaryKey());
    }
  }
  backingMap.getAll(keys);
}

Code above will force all entries for working set to be
preloaded using bulk loadAll(…).
Call it before processing entries.
Why load(…) is called on write?

 Case:
 • Entry processor is called on set of entries which is
   not in cache and assigns values to them
 Question:
 • Why read-through is triggered?
 Answer:
 • BinaryEntry.setValue(Object) returns old value
 • Use BinaryEntry.setValue(Object, boolean)
Bulk put with write through

You can use same trick for updates.
1. Pack your values in entry processor.
2. In entry processor obtain backing map reference.
3. Call putAll(…) on backing map.
Be careful !!!
• You should only put key for partition entry processor
  was called for.
• Backing map accepts serialized objects.
Using operation bundling
                                          Worker thread 3
            Worker    Worker    Worker                       Cache
                                              RWBM
            thread1   thread2   thread3                      Store

    Req 1

    Req 2




                                                   Waiting
    Req 3
                                                   storeAll()
    Req 1
    Req 2
    Req 3


            Worker    Worker    Worker                       Cache
                                              RWBM
            thread1   thread2   thread3                      Store
Using operation bundling

storeAll(…) with N keys could be called if
 You have at least N concurrent operations
 You have at least N threads in worker pool
  <cachestore-scheme>
      <operation-bundling>
          <bundle-confing>
              <operation-name>store</operation-name>
              <delay-millis>5</delay-millis>
              <thread-threshold>4</thread-threshold>
          </bundle-config>
      </operation-bundling>
  </cachestore-scheme>
Checking STORE decoration

    Configure cache as “write-behind”
    Put data
    Wait until, STORE decoration become TRUE
       (actually it will switch from FALSE to null)
public class StoreFlagExtractor extends AbstractExtractor implements PortableObject {
    // ...
    private Object extractInternal(Binary binValue, BinaryEntry entry) {
        if (ExternalizableHelper.isDecorated(binValue)) {
            Binary store = ExternalizableHelper.getDecoration(binValue, ExternalizableHelper.DECO_STORE);
            if (store != null) {
                Object st = ExternalizableHelper.fromBinary(store, entry.getSerializer());
                return st;
            }
        }
        return Boolean.TRUE;
    }
}
BEHIND SCENES
How it works?

     Distributed cache service




      backing-map
       read-write   Internal map


                    Miss cache


                    Cache store
How it works?
Distribution and backup of data

                                  Distributed cache service

                                                               Storing cache data, expiry



                                  backing-map
                                   read-write   Internal map
                                                               Caching cache loader misses

                                                Miss cache          Interacting with
                                                                   persistent storage
                                                Cache store
             Coordination
How it works?
                        get(key)

                             Distributed cache service

     Cache service
     is receiving
     get(…)
     request.
                            backing-map
                             read-write   Internal map


                                          Miss cache


                                          Cache store




#1
How it works?
                         get(key)

                              Distributed cache service

     Cache service       get(key)
     is invoking
     get(…) on
     backing map.
                             backing-map
                              read-write   Internal map
     Partition
     transaction is
     open.                                 Miss cache


                                           Cache store




#2
How it works?
                         get(key)

                              Distributed cache service

     Backing map         get(key)
     checks internal
     map and miss
     cache if present.
                             backing-map
                              read-write   Internal map
     Key is not found.

                                           Miss cache


                                           Cache store




#3
How it works?
                      get(key)

                           Distributed cache service

     Backing map is   get(key)
     invoking
     load(…) on
     cache loader.
                          backing-map
                           read-write   Internal map


                                        Miss cache


                                        Cache store
                      load(key)



#4
How it works?
                        get(key)

                             Distributed cache service

     Cache loader       get(key)
     is retrieving
     value for
     external
                            backing-map
                             read-write   Internal map
     source

                                          Miss cache


                                          Cache store
                        load(key)

                                   query external data source
#5
How it works?
                       get(key)

                            Distributed cache service

     Value is loaded   get(key)



                           backing-map
                            read-write   Internal map


                                         Miss cache


                                         Cache store
                       load(key)

                                  query external data source
#6
How it works?
                      get(key)

                           Distributed cache service

     Backing map is   get(key)
     updating
     internal map

                          backing-map
                           read-write   Internal map


                                        Miss cache


                                        Cache store
                      load(key)

                                 query external data source
#7
How it works?
                          get(key)

                               Distributed cache service

     Internal map is      get(key)
     observable and                                        map event
     cache service is
     receiving event
                              backing-map
                               read-write   Internal map
     about new entry in
     internal map.
                                            Miss cache


                                            Cache store
                          load(key)

                                     query external data source
#8
How it works?
                       get(key)

                            Distributed cache service

     Call to backing   get(key)
     map returns.                                       map event
     Cache service
     is ready to
                           backing-map
                            read-write   Internal map
     commit
     partition
     transaction.                        Miss cache


                                         Cache store
                       load(key)

                                  query external data source
#9
How it works?
                          get(key)
                                                           update backup
                               Distributed cache service

      Partition           get(key)
      transaction is                                       map event
      being
      committed.
                              backing-map
                               read-write   Internal map
      New value is
      being sent to
      backup node.                          Miss cache


                                            Cache store
                          load(key)

                                     query external data source
#10
How it works?
                        get(key)
                                                         update backup
                             Distributed cache service

      Response for      get(key)
      get(…)                                             map event
      request is sent
      back as backup
                            backing-map
                             read-write   Internal map
      has confirmed
      update.
                                          Miss cache


                                          Cache store
                        load(key)

                                   query external data source
#11
How it works?
                         put(k,v)

                              Distributed cache service

     Cache service
     is receiving
     put(…)
     requiest.
                             backing-map
                              read-write   Internal map


                                           Miss cache


                                           Cache store




#1
How it works?
                          put(k,v)

                               Distributed cache service

     Cache service        put(k,v)
     is invoking
     put(…) on
     backing map.
                              backing-map
                               read-write   Internal map
     Partition
     transaction is
     open.                                  Miss cache


                                            Cache store




#2
How it works?
                        put(k,v)

                             Distributed cache service

     Value is           put(k,v)
     immediately
     stored in
     internal map
                            backing-map
                             read-write   Internal map
     and put to
     write-behind
     queue.                               Miss cache


                                          Cache store




#3
How it works?
                               put(k,v)

                                    Distributed cache service

     Cache service is          put(k,v)                         map event
     receiving event, but                                       DECO_STORE=false
     backing map is
     decorating value with
                                   backing-map
                                    read-write   Internal map
     DECO_STORE=false
     flag to mark that value
     is yet-to-stored.                           Miss cache


                                                 Cache store




#4
How it works?
                       put(k,v)

                            Distributed cache service

     Call to backing   put(k,v)                         map event
     map return.                                        DECO_STORE=false


                           backing-map
                            read-write   Internal map


                                         Miss cache


                                         Cache store




#5
How it works?
                             put(k,v)

                                                                update backup
                                  Distributed cache service

     Partition transaction   put(k,v)                         map event
     is being committed.                                      DECO_STORE=false
     Backup will receive
     value decorated with
                                 backing-map
                                  read-write   Internal map
     DECO_STORE=false.

                                               Miss cache


                                               Cache store




#6
How it works?
                        put(k,v)

                                                           update backup
                             Distributed cache service

     Cache service is   put(k,v)                         map event
     sending response                                    DECO_STORE=false
     back as soon as
     backup is
                            backing-map
                             read-write   Internal map
     confirmed.

                                          Miss cache


                                          Cache store




#7
How it works?
                          put(k,v)

                               Distributed cache service

     Eventually, cache    put(k,v)
     store is called to
     persist value.
     It is done on
                              backing-map
                               read-write   Internal map
     separate thread.

                                            Miss cache


                                            Cache store




#8
How it works?
                       put(k,v)

                            Distributed cache service

     Value is stored   put(k,v)
     in external
     storage by
     cache store.
                           backing-map
                            read-write   Internal map


                                         Miss cache


                                         Cache store


                                  store to external storage
#9
How it works?
                              put(k,v)

                                   Distributed cache service

      Once call to cache      put(k,v)                         map event
      store has returned                                       DECO_STORE=null
      successfully. Backing
      map is removing
                                  backing-map
                                   read-write   Internal map
      DECO_STORE
      decoration from value
      is internal map.                          Miss cache
      Cache service is
      receiving map event
                                                Cache store


                                         store to external storage
#10
How it works?
                                put(k,v)

                                                                  update backup
                                     Distributed cache service

      Map event was             put(k,v)                         map event
      received by cache                                          DECO_STORE=null
      service outside of
      service thread. It will
                                    backing-map
                                     read-write   Internal map
      be put to OOB queue
      and eventually
      processed.                                  Miss cache
      Update to backup will
      be sent once event is
      processed.                                  Cache store


                                           store to external storage
#11
THREADING
Requests and jobs



   Client side:
 One method call



      putAll(…)
Requests and jobs

     Network:
  One request for
   each member


                    PutRequest




     putAll(…)      PutRequest




                    PutRequest
Requests and jobs

    Storage node:
 One job per partition
                                      Job




                         PutRequest   Job




      putAll(…)          PutRequest   Job




                         PutRequest
Requests and jobs

Problem
 Single API call may produce hundreds of jobs
  for worker threads in cluster (limited by
  partition count).
 Write-through and read-through jobs could be
  time consuming.
 While all threads are busy by time consuming
  jobs, cache is unresponsive.
Requests and jobs

Workarounds
 Huge thread pools
 Request throttling
    By member (one network request at time)
    By partitions (one job at time)
 Priorities
    Applicable only to EP and aggregators
“UNBREAKABLE CACHE” PATTERN
“Canary” keys

 Canary keys – special keys (one per partitions)
  ignored by all cache operations.
 Canary key is inserted once “recovery”
  procedure have verified that partition data is
  complete.
 If partition is not yet loaded or lost due to
  disaster, canary key will be missing.
Recovery procedure

 Store object hash code in database
 Using hash you can query database for all keys
  belonging to partition
 Knowing all keys, can use read-through to pull
  data to a cache
 Cache is writable during recovery!
 Coherence internal concurrency control will
  ensure consistency
“Unbreakable cache”

read/write-trough + canary keys + recovery
 Key based operations rely on read-through
 Filter based operations are checking “canary”
  keys (and activate recovery is needed)
 Preloading = recovery
 Cache is writable at all times
Checking “canary” keys

 Option 1
   check “canary” keys
   perform query
 Option 2
   perform query
   check “canary” keys
Checking “canary” keys

 Option 1
   check “canary” keys
   perform query
 Option 2
   perform query
   check “canary” keys
 Right way
   check “canaries” inside of query!
“Unbreakable cache”

Motivation
 Incomplete data set would invalidate hundred of hours of
  number crunching
 100% complete data or exception
 Persistent DB is requirement anyway
Summary
 Transparent recovery (+ preloading for free)
 Always writable (i.e. feeds are not waiting for recovery)
 Graceful degradation of service in case of “disastrous
  conditions”
Thank you
http://blog.ragozin.info
- my articles
http://code.google.com/p/gridkit
- my open source code
                                Alexey Ragozin
                    alexey.ragozin@gmail.com

More Related Content

What's hot (20)

PDF
The Google Chubby lock service for loosely-coupled distributed systems
Romain Jacotin
 
PDF
Scalability, Availability & Stability Patterns
Jonas Bonér
 
PPTX
Hazelcast Deep Dive (Paris JUG-2)
Emrah Kocaman
 
PPTX
Spark Tips & Tricks
Jason Hubbard
 
PDF
Hazelcast 101
Emrah Kocaman
 
PDF
Hazelcast Introduction
CodeOps Technologies LLP
 
PDF
Elastic HBase on Mesos - HBaseCon 2015
Cosmin Lehene
 
PDF
Geographically Distributed PostgreSQL
mason_s
 
PDF
Apache Cassandra Multi-Datacenter Essentials (Julien Anguenot, iLand Internet...
DataStax
 
PPTX
In-memory Caching in HDFS: Lower Latency, Same Great Taste
DataWorks Summit
 
PPTX
Zero-downtime Hadoop/HBase Cross-datacenter Migration
Scott Miao
 
PDF
HBase Sizing Guide
larsgeorge
 
PDF
Postgres-XC: Symmetric PostgreSQL Cluster
Pavan Deolasee
 
PPTX
HBaseCon 2012 | Base Metrics: What They Mean to You - Cloudera
Cloudera, Inc.
 
PDF
Optimizing, profiling and deploying high performance Spark ML and TensorFlow ...
DataWorks Summit
 
PPTX
1. beyond mission critical virtualizing big data and hadoop
Chiou-Nan Chen
 
PDF
Understanding Data Consistency in Apache Cassandra
DataStax
 
PDF
Deconstructiong Recommendations on Spark-(Ilya Ganelin, Capital One)
Spark Summit
 
PPTX
Hazelcast Jet v0.4 - August 9, 2017
Rahul Gupta
 
The Google Chubby lock service for loosely-coupled distributed systems
Romain Jacotin
 
Scalability, Availability & Stability Patterns
Jonas Bonér
 
Hazelcast Deep Dive (Paris JUG-2)
Emrah Kocaman
 
Spark Tips & Tricks
Jason Hubbard
 
Hazelcast 101
Emrah Kocaman
 
Hazelcast Introduction
CodeOps Technologies LLP
 
Elastic HBase on Mesos - HBaseCon 2015
Cosmin Lehene
 
Geographically Distributed PostgreSQL
mason_s
 
Apache Cassandra Multi-Datacenter Essentials (Julien Anguenot, iLand Internet...
DataStax
 
In-memory Caching in HDFS: Lower Latency, Same Great Taste
DataWorks Summit
 
Zero-downtime Hadoop/HBase Cross-datacenter Migration
Scott Miao
 
HBase Sizing Guide
larsgeorge
 
Postgres-XC: Symmetric PostgreSQL Cluster
Pavan Deolasee
 
HBaseCon 2012 | Base Metrics: What They Mean to You - Cloudera
Cloudera, Inc.
 
Optimizing, profiling and deploying high performance Spark ML and TensorFlow ...
DataWorks Summit
 
1. beyond mission critical virtualizing big data and hadoop
Chiou-Nan Chen
 
Understanding Data Consistency in Apache Cassandra
DataStax
 
Deconstructiong Recommendations on Spark-(Ilya Ganelin, Capital One)
Spark Summit
 
Hazelcast Jet v0.4 - August 9, 2017
Rahul Gupta
 

Similar to Database backed coherence cache (20)

PDF
ASPLOS2011 workshop RESoLVE "Effect of Disk Prefetching of Guest OS "
Kuniyasu Suzaki
 
PPTX
Jug Lugano - Scale over the limits
Davide Carnevali
 
PDF
EuroSec2011 Slide "Memory Deduplication as a Threat to the Guest OS" by Kuniy...
Kuniyasu Suzaki
 
PDF
인메모리 클러스터링 아키텍처
Jaehong Cheon
 
PDF
Dutch php conference_apc_mem2010
isnull
 
PDF
Rationally boost your symfony2 application with caching tips and monitoring
Giulio De Donato
 
PDF
Caching principles-solutions
pmanvi
 
PDF
.NET Fest 2018. Maarten Balliauw. Let’s refresh our memory! Memory management...
NETFest
 
PPTX
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
Maarten Balliauw
 
PDF
Spring One 2 GX 2014 - CACHING WITH SPRING: ADVANCED TOPICS AND BEST PRACTICES
Michael Plöd
 
PPTX
DotNetFest - Let’s refresh our memory! Memory management in .NET
Maarten Balliauw
 
ODP
Heapoff memory wtf
Olivier Lamy
 
KEY
CHI - YAPC NA 2012
jonswar
 
PDF
Performance Optimization Case Study: Shattering Hadoop's Sort Record with Spa...
Databricks
 
PPTX
Distributed caching and computing v3.7
Rahul Gupta
 
PPTX
Exploring .NET memory management - JetBrains webinar
Maarten Balliauw
 
PDF
Compromising Linux Virtual Machines with Debugging Mechanisms
Russell Sanford
 
PPTX
Think Distributed: The Hazelcast Way
Rahul Gupta
 
PPT
Windows memory manager internals
Sisimon Soman
 
PDF
DSL - Domain Specific Languages, Chapter 4, Internal DSL
Hiro Yoshioka
 
ASPLOS2011 workshop RESoLVE "Effect of Disk Prefetching of Guest OS "
Kuniyasu Suzaki
 
Jug Lugano - Scale over the limits
Davide Carnevali
 
EuroSec2011 Slide "Memory Deduplication as a Threat to the Guest OS" by Kuniy...
Kuniyasu Suzaki
 
인메모리 클러스터링 아키텍처
Jaehong Cheon
 
Dutch php conference_apc_mem2010
isnull
 
Rationally boost your symfony2 application with caching tips and monitoring
Giulio De Donato
 
Caching principles-solutions
pmanvi
 
.NET Fest 2018. Maarten Balliauw. Let’s refresh our memory! Memory management...
NETFest
 
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
Maarten Balliauw
 
Spring One 2 GX 2014 - CACHING WITH SPRING: ADVANCED TOPICS AND BEST PRACTICES
Michael Plöd
 
DotNetFest - Let’s refresh our memory! Memory management in .NET
Maarten Balliauw
 
Heapoff memory wtf
Olivier Lamy
 
CHI - YAPC NA 2012
jonswar
 
Performance Optimization Case Study: Shattering Hadoop's Sort Record with Spa...
Databricks
 
Distributed caching and computing v3.7
Rahul Gupta
 
Exploring .NET memory management - JetBrains webinar
Maarten Balliauw
 
Compromising Linux Virtual Machines with Debugging Mechanisms
Russell Sanford
 
Think Distributed: The Hazelcast Way
Rahul Gupta
 
Windows memory manager internals
Sisimon Soman
 
DSL - Domain Specific Languages, Chapter 4, Internal DSL
Hiro Yoshioka
 
Ad

More from aragozin (20)

PDF
Java on Linux for devs and ops
aragozin
 
PDF
I know why your Java is slow
aragozin
 
PPTX
Java profiling Do It Yourself (jug.msk.ru 2016)
aragozin
 
PDF
Java black box profiling JUG.EKB 2016
aragozin
 
PDF
Распределённое нагрузочное тестирование на Java
aragozin
 
PDF
What every Java developer should know about network?
aragozin
 
PPTX
Java profiling Do It Yourself
aragozin
 
PPTX
DIY Java Profiler
aragozin
 
PPTX
Java black box profiling
aragozin
 
PDF
Блеск и нищета распределённых кэшей
aragozin
 
PDF
JIT compilation in modern platforms – challenges and solutions
aragozin
 
PDF
Casual mass parallel computing
aragozin
 
PPTX
Nanocloud cloud scale jvm
aragozin
 
PDF
Java GC tuning and monitoring (by Alexander Ashitkin)
aragozin
 
PDF
Garbage collection in JVM
aragozin
 
PDF
Virtualizing Java in Java (jug.ru)
aragozin
 
PDF
Filtering 100M objects in Coherence cache. What can go wrong?
aragozin
 
PDF
Cборка мусора в Java без пауз (HighLoad++ 2013)
aragozin
 
PDF
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
aragozin
 
PDF
Performance Test Driven Development (CEE SERC 2013 Moscow)
aragozin
 
Java on Linux for devs and ops
aragozin
 
I know why your Java is slow
aragozin
 
Java profiling Do It Yourself (jug.msk.ru 2016)
aragozin
 
Java black box profiling JUG.EKB 2016
aragozin
 
Распределённое нагрузочное тестирование на Java
aragozin
 
What every Java developer should know about network?
aragozin
 
Java profiling Do It Yourself
aragozin
 
DIY Java Profiler
aragozin
 
Java black box profiling
aragozin
 
Блеск и нищета распределённых кэшей
aragozin
 
JIT compilation in modern platforms – challenges and solutions
aragozin
 
Casual mass parallel computing
aragozin
 
Nanocloud cloud scale jvm
aragozin
 
Java GC tuning and monitoring (by Alexander Ashitkin)
aragozin
 
Garbage collection in JVM
aragozin
 
Virtualizing Java in Java (jug.ru)
aragozin
 
Filtering 100M objects in Coherence cache. What can go wrong?
aragozin
 
Cборка мусора в Java без пауз (HighLoad++ 2013)
aragozin
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
aragozin
 
Performance Test Driven Development (CEE SERC 2013 Moscow)
aragozin
 
Ad

Recently uploaded (20)

PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
Biography of Daniel Podor.pdf
Daniel Podor
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 

Database backed coherence cache

  • 1. Database backed Coherence cache Tips, Tricks and Patterns Alexey Ragozin [email protected] May 2012
  • 2. Power of read-write-backing-map • Fetching data as needed • Separation of concerns • Gracefully handling concurrency • Write-behind – removing DB from critical path • Database operation bundling
  • 3. … and challenges  DB operations are order of magnitude slower • Less deterministic response time • Coherence thread pools issues  How verify persistence with write behind?  Data are written in DB in random order  read-write-backing-map and expiry
  • 5. BinaryEntryStore, did you know? BinaryEntryStore – an alternative to CacheLoader / CacheStore interface. Works with BinaryEntry instead of objects.  You can access binary key and value • Skip deserialization, if binary is enough  You can access previous version of value • Distinguish inserts vs. updates • Find which fields were cached  You cannot set entry TTL in cache loader 
  • 6. When storeAll(…) is called?  cache.getAll(…) • loadAll(…) will be called with partition granularity (since Coherence 3.7)  cache.putAll(…) • write-behind scheme will use storeAll(…) • write-through scheme will use store(…) (this could be really slow)
  • 7. When storeAll(…) is called?  cache.invokeAll(…)/aggregate(…) • calling get() on entry will invoke load(…) (if entry is not cached yet) • calling set() on entry will invoke put(…) (in case of write-through) • you can check entry.isPresent() to avoid needless read-through • Coherence will never use bulk cache store operations for aggregators and entry processors
  • 8. Warming up aggregator public static void preloadValuesViaReadThrough(Set<BinaryEntry> entries) { CacheMap backingMap = null; Set<Object> keys = new HashSet<Object>(); for (BinaryEntry entry : entries) { if (backingMap == null) { backingMap = (CacheMap) entry.getBackingMapContext().getBackingMap(); } if (!entry.isPresent()) { keys.add(entry.getBinaryKey()); } } backingMap.getAll(keys); } Code above will force all entries for working set to be preloaded using bulk loadAll(…). Call it before processing entries.
  • 9. Why load(…) is called on write? Case: • Entry processor is called on set of entries which is not in cache and assigns values to them Question: • Why read-through is triggered? Answer: • BinaryEntry.setValue(Object) returns old value • Use BinaryEntry.setValue(Object, boolean)
  • 10. Bulk put with write through You can use same trick for updates. 1. Pack your values in entry processor. 2. In entry processor obtain backing map reference. 3. Call putAll(…) on backing map. Be careful !!! • You should only put key for partition entry processor was called for. • Backing map accepts serialized objects.
  • 11. Using operation bundling Worker thread 3 Worker Worker Worker Cache RWBM thread1 thread2 thread3 Store Req 1 Req 2 Waiting Req 3 storeAll() Req 1 Req 2 Req 3 Worker Worker Worker Cache RWBM thread1 thread2 thread3 Store
  • 12. Using operation bundling storeAll(…) with N keys could be called if  You have at least N concurrent operations  You have at least N threads in worker pool <cachestore-scheme> <operation-bundling> <bundle-confing> <operation-name>store</operation-name> <delay-millis>5</delay-millis> <thread-threshold>4</thread-threshold> </bundle-config> </operation-bundling> </cachestore-scheme>
  • 13. Checking STORE decoration  Configure cache as “write-behind”  Put data  Wait until, STORE decoration become TRUE (actually it will switch from FALSE to null) public class StoreFlagExtractor extends AbstractExtractor implements PortableObject { // ... private Object extractInternal(Binary binValue, BinaryEntry entry) { if (ExternalizableHelper.isDecorated(binValue)) { Binary store = ExternalizableHelper.getDecoration(binValue, ExternalizableHelper.DECO_STORE); if (store != null) { Object st = ExternalizableHelper.fromBinary(store, entry.getSerializer()); return st; } } return Boolean.TRUE; } }
  • 15. How it works? Distributed cache service backing-map read-write Internal map Miss cache Cache store
  • 16. How it works? Distribution and backup of data Distributed cache service Storing cache data, expiry backing-map read-write Internal map Caching cache loader misses Miss cache Interacting with persistent storage Cache store Coordination
  • 17. How it works? get(key) Distributed cache service Cache service is receiving get(…) request. backing-map read-write Internal map Miss cache Cache store #1
  • 18. How it works? get(key) Distributed cache service Cache service get(key) is invoking get(…) on backing map. backing-map read-write Internal map Partition transaction is open. Miss cache Cache store #2
  • 19. How it works? get(key) Distributed cache service Backing map get(key) checks internal map and miss cache if present. backing-map read-write Internal map Key is not found. Miss cache Cache store #3
  • 20. How it works? get(key) Distributed cache service Backing map is get(key) invoking load(…) on cache loader. backing-map read-write Internal map Miss cache Cache store load(key) #4
  • 21. How it works? get(key) Distributed cache service Cache loader get(key) is retrieving value for external backing-map read-write Internal map source Miss cache Cache store load(key) query external data source #5
  • 22. How it works? get(key) Distributed cache service Value is loaded get(key) backing-map read-write Internal map Miss cache Cache store load(key) query external data source #6
  • 23. How it works? get(key) Distributed cache service Backing map is get(key) updating internal map backing-map read-write Internal map Miss cache Cache store load(key) query external data source #7
  • 24. How it works? get(key) Distributed cache service Internal map is get(key) observable and map event cache service is receiving event backing-map read-write Internal map about new entry in internal map. Miss cache Cache store load(key) query external data source #8
  • 25. How it works? get(key) Distributed cache service Call to backing get(key) map returns. map event Cache service is ready to backing-map read-write Internal map commit partition transaction. Miss cache Cache store load(key) query external data source #9
  • 26. How it works? get(key) update backup Distributed cache service Partition get(key) transaction is map event being committed. backing-map read-write Internal map New value is being sent to backup node. Miss cache Cache store load(key) query external data source #10
  • 27. How it works? get(key) update backup Distributed cache service Response for get(key) get(…) map event request is sent back as backup backing-map read-write Internal map has confirmed update. Miss cache Cache store load(key) query external data source #11
  • 28. How it works? put(k,v) Distributed cache service Cache service is receiving put(…) requiest. backing-map read-write Internal map Miss cache Cache store #1
  • 29. How it works? put(k,v) Distributed cache service Cache service put(k,v) is invoking put(…) on backing map. backing-map read-write Internal map Partition transaction is open. Miss cache Cache store #2
  • 30. How it works? put(k,v) Distributed cache service Value is put(k,v) immediately stored in internal map backing-map read-write Internal map and put to write-behind queue. Miss cache Cache store #3
  • 31. How it works? put(k,v) Distributed cache service Cache service is put(k,v) map event receiving event, but DECO_STORE=false backing map is decorating value with backing-map read-write Internal map DECO_STORE=false flag to mark that value is yet-to-stored. Miss cache Cache store #4
  • 32. How it works? put(k,v) Distributed cache service Call to backing put(k,v) map event map return. DECO_STORE=false backing-map read-write Internal map Miss cache Cache store #5
  • 33. How it works? put(k,v) update backup Distributed cache service Partition transaction put(k,v) map event is being committed. DECO_STORE=false Backup will receive value decorated with backing-map read-write Internal map DECO_STORE=false. Miss cache Cache store #6
  • 34. How it works? put(k,v) update backup Distributed cache service Cache service is put(k,v) map event sending response DECO_STORE=false back as soon as backup is backing-map read-write Internal map confirmed. Miss cache Cache store #7
  • 35. How it works? put(k,v) Distributed cache service Eventually, cache put(k,v) store is called to persist value. It is done on backing-map read-write Internal map separate thread. Miss cache Cache store #8
  • 36. How it works? put(k,v) Distributed cache service Value is stored put(k,v) in external storage by cache store. backing-map read-write Internal map Miss cache Cache store store to external storage #9
  • 37. How it works? put(k,v) Distributed cache service Once call to cache put(k,v) map event store has returned DECO_STORE=null successfully. Backing map is removing backing-map read-write Internal map DECO_STORE decoration from value is internal map. Miss cache Cache service is receiving map event Cache store store to external storage #10
  • 38. How it works? put(k,v) update backup Distributed cache service Map event was put(k,v) map event received by cache DECO_STORE=null service outside of service thread. It will backing-map read-write Internal map be put to OOB queue and eventually processed. Miss cache Update to backup will be sent once event is processed. Cache store store to external storage #11
  • 40. Requests and jobs Client side: One method call putAll(…)
  • 41. Requests and jobs Network: One request for each member PutRequest putAll(…) PutRequest PutRequest
  • 42. Requests and jobs Storage node: One job per partition Job PutRequest Job putAll(…) PutRequest Job PutRequest
  • 43. Requests and jobs Problem  Single API call may produce hundreds of jobs for worker threads in cluster (limited by partition count).  Write-through and read-through jobs could be time consuming.  While all threads are busy by time consuming jobs, cache is unresponsive.
  • 44. Requests and jobs Workarounds  Huge thread pools  Request throttling  By member (one network request at time)  By partitions (one job at time)  Priorities  Applicable only to EP and aggregators
  • 46. “Canary” keys  Canary keys – special keys (one per partitions) ignored by all cache operations.  Canary key is inserted once “recovery” procedure have verified that partition data is complete.  If partition is not yet loaded or lost due to disaster, canary key will be missing.
  • 47. Recovery procedure  Store object hash code in database  Using hash you can query database for all keys belonging to partition  Knowing all keys, can use read-through to pull data to a cache  Cache is writable during recovery!  Coherence internal concurrency control will ensure consistency
  • 48. “Unbreakable cache” read/write-trough + canary keys + recovery  Key based operations rely on read-through  Filter based operations are checking “canary” keys (and activate recovery is needed)  Preloading = recovery  Cache is writable at all times
  • 49. Checking “canary” keys  Option 1  check “canary” keys  perform query  Option 2  perform query  check “canary” keys
  • 50. Checking “canary” keys  Option 1  check “canary” keys  perform query  Option 2  perform query  check “canary” keys  Right way  check “canaries” inside of query!
  • 51. “Unbreakable cache” Motivation  Incomplete data set would invalidate hundred of hours of number crunching  100% complete data or exception  Persistent DB is requirement anyway Summary  Transparent recovery (+ preloading for free)  Always writable (i.e. feeds are not waiting for recovery)  Graceful degradation of service in case of “disastrous conditions”
  • 52. Thank you http://blog.ragozin.info - my articles http://code.google.com/p/gridkit - my open source code Alexey Ragozin [email protected]