3. Distributed Cache
• Fast access to data
• Performance boost
• Elasticity
• High Availability
• JSR 107 (Temporary Caching for the Java Platform)
– Read, write, expiration, write-through, distribution
5. In-Memory Data Grid
• Evolution of distributed caches
• Clustered by nature (shared across multiple servers)
• Low response time
• High throughput
• Predictable scalability
• High Availability
• Querying
• Task Execution (Map/Reduce)
• JSR 347 (Data Grid for the Java Platform)
6. In-Memory Data Grid (cont.)
Persistence
(DataStore)
In-Memory
Data Grid
Node
Node
Node
App
App
App
7. IMDG for What?
• Sharing data (session, app states)
• Toolkit for clustering
• Performance (caching, in-memory processing)
• Scalability
• Database on cloud
9. Cache vs. Data Grid
• JSR 107 - Temporary Caching for the Java Platform
– Basic interaction(read, write, expiry)
– Transactions with JTA compatibility
– Listener
– Persistence: read-through, write-through, write-behind
– Annotations
– javax.cache.*
• JSR 347 - Data Grids for the Java Platform
– Asynchronous, non-blocking API
– Distributed code execution and map/reduce API
– Group API for co-location
– Annotations (CDI)
– Eventually Consistent API
– Querying
– Configuration
– javax.datagrid.*
13. Architecture: as library, clustered
Cluster
Infinispan
JVM
App
Infinispan
JVM
App
Infinispan
JVM
App
Application doesn’t know it’s on cluster
l Use as library
– More features
– Richer APIs
– Programmatic/
Declarative
configuration
– Extendable/
embeddable
– Faster (API call)
14. Architecture: as server, clustered
• Use as server
– Remote
– Data tier shared by
multi-apps
– App doesn’t affect
cluster
– Non-java clients
• C++, .NET, Ruby
, Python, Java
Cluster
Infinispan
JVM
Infinispan
JVM
Infinispan
JVM
App
App
App
15. Architecture: multi clusters
• Multi-clusters
– By replication
– By persistence
– By replication
to other clust
er (topology a
ware)
Cluster
Infinispan
JVM
Infinispan
JVM
Cluster
Infinispan
JVM
Infinispan
JVM
persistence
16. Clustering
• Peer-to-Peer
– No central master, no single point of failure, no single
bottle neck
• JGroups
– Reliable multicast communication library, nodes
discovery, sharing data, performing cluster scaling
• Consistent Hash
– Hash based data distribution
– How it finds where data locates
• Linear in nature: throughput, capacity
20. Persistence
• Used for durability
• Cache Store - Persistence Storage
– File System, Cloud, Remote, JDBC, JPA, LevelDB,
Cassandra, HBase, MongoDB, BerkeleyDB, JDBM, REST
• CacheLoader, CacheWriter
• Read-through, write-through, write-behind
• Passivation, activation
• Store chain
• Shared store
21. Persistence (cont.)
• Passivation – write to persistence when evicted
from memory (default)
• Activation – read to memory and remove from
persistence
24. Distributed Execution
• Executes codes on distributed nodes
• Through a standard JDK ExecutorService interface
• Use DistributedCallable extends
java.util.concurrent.Callable
25. Map/Reduce
• Based on Distributed Execution Framework
• Mapper, Reducer, Collator, MapReduceTask
public interface Callator<KOut, Vout, R> {
R collate(Map<KOut, VOut>);
}
public interface Mapper<KIn, VIn, KOut, VOut> extends Serializable {
void map(KIn key, VIn value, Collector<KOut, VOut> collector);
}
public interface Reducer<KOut, VOut> extends Serializable {
VOut reduce(KOut reducedKey, Iterator<VOut> iter);
}
28. Listener
• Listener on CacheManager
– Node join/ leave, Cache start/ stop
• Cache
– CRUD, Eviction/ Passivation
– Rehashing/ Transaction completion
@Listener
public class SimpleListener {
@CacheEntryCreated
public void dataAdded(CacheEntryCreatedEvent event) {
if (event.isPre()) {
System.out.println("Before creating the entry:" + event.getKey());
} else {
System.out.println("After creating the entry:" + event.getKey());
}
…
}
DefaultCacheManager manager = new DefaultCacheManager();
manager.addListener(listener);
Cache<Integer, Ticket> cache = manager.getCache();
cache.addListener(listener);
29. Asynchronous APIs
• put() and get() and remove() are synchronous
– They wait for RPC and Locks (and maybe cache stores)
• The asynchronous API returns NotifyingFuture
– Events are fired on completion of the operation
NotifyingFuture<String> future = c.removeAsync(key);
future.attachListener(new FutureListener<String>() {
@Override
public void futureDone(Future<String> future) {
try {
future.get();
System.out.printf ("The entry stored under key %s has been removed.", key);
} catch (ExecutionException e) {
System.out.printf("Failed to remove %s!", key);
}
}
});
30. Spring Integration
• Infinispan provider for Spring cache abstraction
• infinispan-spring.jar
<cache:annotation-driven cache-manager=“myCacheManager"/>
<bean id="operationCacheManager"
class="org.infinispan.spring.provider.SpringEmbeddedCacheManagerFactoryBean"
p:configurationFileLocation="classpath:infinispan -config.xml" />
@Cacheable(value = "secureContextCache", key="#contextId")
public SecureLayerContext getSecureLayerContext(String contextId) {
return null;
}
@CachePut(value = "secureContextCache", key="#contextId")
public SecureLayerContext setSecureLayerContext(String contextId,
SecureLayerContext secureLayerContext) {
return secureLayerContext;
}
@CacheEvict(value = "secureContextCache", key="#contextId")
public void removeSecureLayerContext(String contextId) {
// Intentionally blank
}
32. Infinispan on JBoss AS 7 (WildFly 8)
• Used for session clustering, Hibernate L2 cache
• Application gets cache with JNDI name using
@Resource
• XML Configuration in server configuration file
<cache-container name="web" aliases="standard-session-cache" default-cache="repl">
<transport lock-timeout="60000" />
<replicated-cache name="repl" mode="ASYNC" batching="true">
<file-store />
</replicated-cache>
</cache-container>
33. Marshalling
• JBoss Marshalling framework used for POJOs
• User can provide custom Externalizer impls for
non-Serializable object
• Custome marshaller can be provided as well
36. Radar Gun
• Data grid and distributed cache benchmarking
framework
• Built to test Infinispan and other distributed data
grid platforms
• https://github.com/radargun/radargun
38. Use Cases: In Streaming Processing
Infinispan Data Grid
39. Use Cases: Data Grid Platform
In-Memory 대용량 데이터 처리를 위한 아키텍쳐 구조 제시 및 적용 사례,
제 6회 한국 소프트웨어 아키텍트 대회 최우수상, 2013
40. Use Case: Session Clustering
• Store session information into cache
in Spring MVC Interceptor
41. Case Study: Session Clustering
#1 Spring Cache Abstraction 사용하
여 쉽게 다른 캐시 구현체 사용 가능하
게
• ConcurrentHashMap, EHCache
• Infinispan
#2 SecurityContext를 캐시에 저장
• 기본적으로 HTTP Session에 저장
(HttpSessionSecurityContextRepository)
• SecurityContextRepository 구현한
CacheSecurityContextRepository 작성
하여 HTTP Session 대신 캐시를 사용하
도록 함
42. Case Study: Infinispan with Spring
Loadbalancer
Client
Client
Client
Infinispan
Application
Services
Spring
Security
WAS
Infinispan
Application
Services
Spring
Security
WAS
Infinispan
Application
Services
Spring
Security
WAS
. . .
43. Infinispan with Spring (cont.)
• infinispan-config.xml
<global>
<transport clusterName=”MyCacheCluster">
<properties>
<property name="configurationFile" value="jgroups-tcp.xml" />
</properties>
</transport>
</global>
<default>
<clustering mode="replication">
<sync />
</clustering>
</default>
<namedCache name="securityContextCache">
<!– maxEntries means the maximum concurrent user connections-->
<eviction strategy="LIRS" maxEntries="10000" />
<!-- the max idle time is 30 minutes -->
<expiration maxIdle="1800000" />
</namedCache>
44. Infinispan with Spring (cont.)
• spring-cache-config.xml
• SpringEmbeddedCacheManagerFactoryBean
<cache:annotation-driven cache-manager="myCacheManager"/>
<bean id="myCacheManager"
class="my.domain.MyCacheManagerFactoryBean"
p:configurationFileLocation="classpath:infinispan-config.xml" />
public class MyCacheManagerFactoryBean extends SpringEmbeddedCacheManagerFactoryBean {
@Override public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
addListeners();
}
private void addListeners() throws Exception {
SpringEmbeddedCacheManager cacheManager = getObject();
if (cacheManager.getNativeCacheManager() instanceof EmbeddedCacheManager) {
cacheManager.getNativeCacheManager().addListener(new MyCacheManagerListener());
}
Collection<String> cacheNames = cacheManager.getCacheNames();
for (String cacheName : cacheNames) {
SpringCache cache = cacheManager.getCache(cacheName);
if (cache.getNativeCache() instanceof Cache) {
((Cache<?,?>)cache.getNativeCache()).addListener(new MyCacheListener());
}}}}
45. Infinispan with Spring (cont.)
• Dao Implementation
@Named("SecurityContextDao")
public class SecurityContextDaoImpl implements SecurityContextDao {
@Cacheable(value = "securityContextCache", key="#key")
public SecurityContext getSecurityContext(String key) {
return null;
}
@CachePut(value = "securityContextCache", key="#key")
public SecurityContext setSecurityContext(String key, SecurityContext securityContext) {
return securityContext;
}
@CacheEvict(value = "securityContextCache", key="#key")
public void removeSecurityContext(String key) {
// Intentionally blank
}
}
46. Infinispan with Spring (cont.)
• Spring Security’s SecurityContextRepository
public class MyCacheSecurityContextRepository implements SecurityContextRepository {
@Inject SecurityContextDao securityContextDao;
public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) {
...
return securityContextDao.getSecurityContext(authToken);
}
public void saveContext(SecurityContext context, HttpServletRequest request,
HttpServletResponse response) {
...
securityContextDao.setSecurityContext(authToken, context);
...
}
public boolean containsContext(HttpServletRequest request) {
...
return securityContextDao.getSecurityContext(key) != null;
}
}