SPRING 3.1 에서 Ehcache 활용전략 김흥래
NHN INS 경영지원개발팀에서그룹웨어를개발하고있습니다. 자바카페 (JAVACAFE) 커뮤니티에서 5 년째운영진으로활동하고있습니다. 발표자 김흥래
AGENDA WARMING-UP Cache 개념잡기 Ehcache 소개 Ehcache 활용하기 다양한 Architecture 우리서비스는? Ehcache 가이드 기본사용법 Spring 3.0 Cache 동기화 Cache 모니터링 DEMO
WARMING-UP
WARMING-UP : CACHE 개념잡기 롱테일 (LONG TAIL) 법칙 ( 출처 http://www.longtail.com) 20% 의요구가시스템의 80% 의리소스를점유한다는법칙자주사용되는데이터는 Cache 사용으로성능을대폭향상시킬수있다.
WARMING-UP : CACHE 개념잡기 CACHE? 평소자주사용되는데이터를저장해두는임시저장소 생성에많은비용이필요한정보를저장해두는임시저장소 CPU L1, L2 Cache Disk Cache DNS Cache Query Cache
WARMING-UP : CACHE 개념잡기 웹서비스관점의 CACHE 웹페이지화면 Browser Cache Apache Cache DB 조회결과 Ibatis Oscache 공유메모리 Terracotta BigMemory Static 자원 Ehcache 비싼비용의연산결과
WARMING-UP : CACHE 개념잡기 LOCAL CACHE vs GLOBAL CACHE Local Cache 로컬장비내에서만사용되는캐시 로컬자원을활용 ( 메모리, 디스크 ) 빠른결과 다른서버와데이터공유가어려움 Global Cache 다수의서버가공유하는캐시 데이터분산저장 ( 확장성 ) 로컬캐시보다느리다. ( 네트워크트래픽 ) 데이터공유가상대적으로쉬움
WARMING-UP : CACHE 개념잡기 다양한 CACHE
WARMING-UP : CACHE 개념잡기 다양한 CACHE
WARMING-UP : Ehcache 소개 EHCACHE 오픈소스기반의빠른캐시엔진 JSR107 JCache 표준지원 경량의간단한 Local Cache 다양한확장지원 ( 메모리, 디스크 ) 분산캐시지원 ( 동기 / 비동기복제 )
WARMING-UP : Ehcache 소개 ENTERPRISE DATA CACHE ( 출처 http://www.ehcache.org) 기업에서사용하는시스템의 70% 가직간접적으로 Ehcache를사용하고있다.
WARMING-UP : Ehcache 소개 JSR107 JCACHE 완벽지원 JCP (Java Community Process) 자바표준을정의하는표준화과정 JSR (Java Specification Requests) 자바 Spec을기술하는공식문서 JSR107 JCACHE Java Temporary Caching API 자바 Cache Spec Ehcache는 JSR107 표준을완벽하게지원한다.
WARMING-UP : Ehcache 소개 EHCACHE BUNDLING ( 출처 http://www.ehcache.org) 직접사용하는형태가아니라번들형태로사용되는경우 Hibernate에의한활용비중이가장크다.
WARMING-UP : Ehcache 소개 TERRACOTTA 서버 오픈소스기반의분산객체저장소 JVM 클러스터링프레임워크 NAM (Natwork Attached Memory) BigMemory (FullGC 방지 ) WAS 세션클러스터링 (HttpSession 복제 ) Session Grid, Data Grid
WARMING-UP : Ehcache 소개 EHCACHE ENTERPRISE 서버 Ehcache 분산캐시기능강화 Replication Cache RMI Replicated Caching JGroups Replicated Caching JMS Replicated Caching Distributed Cache Terracotta Server Array CacheManager Sharing
WARMING-UP : Ehcache 소개 LICENCE Ehcache 배포판 Commercial Version OpenSource Version Ehcache를 Local Cache로사용할경우기능상의차이점은없음. OpenSource 버전의경우 Apache 2.0 License
WARMING-UP : Ehcache 소개 EHCACHE VERSION 별비중 ( 출처 http://www.ehcache.org) 다양한버전이아직많이사용되고있다. 현재최신버전은 2012년 11 월에배포된 2.6.2 버전이다.
WARMING-UP : Ehcache 소개 RELEASE NOTE 2012. 11 : Ehcache 2.6.2 Released 2012. 04 : Ehcache 2.5.2 Released 2011. 11 : Ehcache 2.5 Released 2011. 05 : Terracotta Joins Software AG 2011. 04 : Ehcache 2.4.2 Released 2010. 11 : BigMemory for Ehcache GA 2009. 08 : Terracotta acquires Ehcache
EHCACHE 활용하기
Ehcache 활용하기 : 다양한 Architecture 서비스를만들어볼까요?
Ehcache 활용하기 : 다양한 Architecture STAND ALONE Session Local Cache 서버 (www.test.com)
Ehcache 활용하기 : 다양한 Architecture STAND ALONE
Ehcache 활용하기 : 다양한 Architecture STAND ALONE 사용자가몰린다. 서버를 2 대로늘려야겠다. Session은어떻게처리하지?
Ehcache 활용하기 : 다양한 Architecture STICKY SESSION Session Local Cache 서버 (www1.test.com) L4 www.test.com Session Local Cache 서버 (www2.test.com)
Ehcache 활용하기 : 다양한 Architecture STAND ALONE
Ehcache 활용하기 : 다양한 Architecture STICKY SESSION 서버가 2 대라좋긴한데하나의서버에장애가발생하면장애서버의 Session 정보가전부날라가버리네? 서버간에 Session 정보를공유할수없을까?
Ehcache 활용하기 : 다양한 Architecture SESSION CLUSTERING Session Local Cache 서버 (www1.test.com) Session Clustering (Replication) L4 www.test.com Session Local Cache 서버 (www2.test.com)
Ehcache 활용하기 : 다양한 Architecture SESSION CLUSTERING
Ehcache 활용하기 : 다양한 Architecture SESSION CLUSTERING Business가너무잘되네. 증가하는사용자를감당하기힘들다. 장비를두배로늘리자. 어라???? 장비를두배로늘렸는데성능은더떨어진거같아. 도대체뭐가문제지?
Ehcache 활용하기 : 다양한 Architecture WEB SESSION Session Local Cache 서버 (www1.test.com) Terracotta Web Session Server L4 www.test.com Session Local Cache 서버 (www2.test.com)
Ehcache 활용하기 : 다양한 Architecture WEB SESSION 사용자가계속증가하네. 장비를더늘리자. 가만... Session이꼭필요한걸까?
Ehcache 활용하기 : 다양한 Architecture AUTHENTICATION COOKIE Cookie Local Cache Cookie 서버 (www1.test.com) Cookie L4 www.test.com Local Cache 서버 (www2.test.com)
Ehcache 활용하기 : 다양한 Architecture AUTHENTICATION COOKIE Session을사용하지않으니까서버의확장성은좋은데정보를사용자 Cookie에저장하니불안하네. 다른방법은없을까? 사용자 Unique한정보는어디에저장해야할까?
Ehcache 활용하기 : 다양한 Architecture SSO + CACHE REPLICATION Local Cache 서버 (www1.test.com) Cache Replication Single Sign On Authentication L4 www.test.com Local Cache 서버 (www2.test.com)
Ehcache 활용하기 : 다양한 Architecture SSO + CACHE REPLICATION Cookie를사용하지않아서좋긴한데사용자 Unique한정보를실시간으로복제하려니서버간의트래픽이엄청나네.. Global Cache를도입해볼까?
Ehcache 활용하기 : 다양한 Architecture GLOBAL CACHE Local Cache 서버 (www1.test.com) Global Cache Single Sign On Authentication L4 www.test.com Local Cache 서버 (www2.test.com)
Ehcache 활용하기 : 다양한 Architecture GLOBAL CACHE 사용자인증은 Session 대신에 SSO를이용하고사용자 Unique한정보는 Global Cache에저장하고 Static한정보들은 Local Cache를활용하니너무너무좋아요. ^^
Ehcache 활용하기 : 다양한 Architecture 우리서비스는? Ehcache Ehcache SSO Memcached... Cloud L4 Ehcache
EHCACHE 가이드
Ehcache 가이드 : 기본사용법 개요 라이브러리 ehcache-core-2.5.2.jar 환경설정 (ehcache.xml) Cache 객체명, Data Size, 유효기간, 동기화정책 CacheManager 생성 모든 Cache 객체를관리한다. Cache Operation Cache 객체로드 add(), get(), remove() 캐시대상이되는모든객체는 Serializable 되어야한다.
Ehcache 가이드 : 기본사용법 MAVEN 설정 <dependency> <groupid>net.sf.ehcache</groupid> <artifactid>ehcache-core</artifactid> <version>2.5.2</version> </dependency> Local Cache 용도로만사용할경우설정시 ehcache-core.jar 라이브러리만등록하면된다.
Ehcache 가이드 : 기본사용법 환경설정 : 캐시정책
Ehcache 가이드 : 기본사용법 환경설정 : 캐시정책 maxelementsinmemory = 20000 // 저장될객체의최대수 eternal = false // 시간설정무시옵션 timetoidleseconds = 600 // 설정된시간동안 Idle 상태시갱신 (10분) timetoliveseconds = 3600 // 설정된시간동안유지후갱신 (1 시간 ) overflowtodisk = false // 메모리부족시디스크저장옵션 diskpersistent = false // 디스크저장사용옵션 memorystoreevictionpolicy = LRU // 데이터제거알고리즘옵션 statistics = true // JMX 통계정보갱신옵션
Ehcache 가이드 : 기본사용법 CacheManager 생성 모든 Cache 객체는 CacheManager에의해서관리 CacheManager 생성시에 Singleton Mode와 Instance Mode 2 가지 Mode를지원 // Singleton Mode CacheManager.newInstance(); String[] cachenames = manager.getcachenames(); // Instance Mode CacheManager manager1 = CacheManager.newInstance("src/config/ehcache1.xml"); CacheManager manager2 = CacheManager.newInstance("src/config/ehcache2.xml"); String[] cachenamesformanager1 = manager1.getcachenames(); String[] cachenamesformanager2 = manager2.getcachenames();
Ehcache 가이드 : 기본사용법 CACHE OPERATION 모든 Cache 객체는 Serializable 되어야한다. 만약 Serializable 되지않은객체가디스크에저장되면정상적으로저장되지않는다. // Add, Get CacheManager singletonmanager = CacheManager.create(); singletonmanager.addcache("testcache"); Cache test = singletonmanager.getcache("testcache"); // Remove CacheManager singletonmanager = CacheManager.create(); singletonmanager.removecache("samplecache1");
Ehcache 가이드 : 기본사용법 CACHE 관리정보조회 사용중인 Cache 객체의리소스사용량을구할수있다. 다양한통계정보도제공한다. Cache cache = manager.getcache("samplecache1"); // 리소스사용량 int elementsinmemory = cache.getsize(); long elementsinmemory = cache.getmemorystoresize(); long elementsinmemory = cache.getdiskstoresize(); // 통계정보 int hits = cache.gethitcount(); int hits = cache.getmemorystorehitcount(); int hits = cache.getdiskstorecount(); int hits = cache.getmisscountnotfound(); int hits = cache.getmisscountexpired();
Ehcache 가이드 : SPRING 3.0 SPRING 3.0 Spring Framework 기반의캐시추상화제공 (CacheManager) Ehcache-Spring Integration을이용한 Annotation 제공 (Google Project) http://code.google.com/p/ehcache-spring-annotations/ 이제그만! 고민하지말고이제부터는 Spring 3.1을사용합시다.
Ehcache 가이드 : SPRING 3.1 SPRING 3.1 기본적인캐시구현체제공 JDK ConcurrentMap-based Cache Ehcache-based Cache Spring Framework 차원의 Annotation 제공
Ehcache 가이드 : SPRING 3.1 CONCURRENTMAP-BASED CACHE JDK에기본포함된 ConcurrentMap을이용하여캐시 java.util.concurrent.concurrentmap 설정이비교적간단 기능이단순 동기화가필요없는간단한 Cache 모델에적합
Ehcache 가이드 : SPRING 3.1 EHCACHE-BASED CACHE Ehache를이용하여캐시 StandAlone 캐시서버 Hibernate L2 Cache JMX나패킷을이용한데이터동기화 Terracotta Server Array를이용한 Distributed Cache 제공 RMI를이용한 Replication 제공
Ehcache 가이드 : SPRING 3.1 CACHE ANNOTATION @Cacheable @CacheEvict 캐시설정을위한 SpEL 제공 Custom Annotation 사용가능
Ehcache 가이드 : SPRING 3.1 CACHE ANNOTATION @Cacheable(value="sampleCache", key="#boardid") public List<Board> findboardlist(string boardid) { return boardrepository.selectboardlist(boardid); } @CacheEvict(value="sampleCache", key="#boardid") public void editboard(board board) { boardrepository.updateboard(board); }
Ehcache 가이드 : Cache 동기화 CACHE REPLICATION
Ehcache 가이드 : Cache 동기화 캐시동기화방식 Ehcache의경우데이터복제를위한 3 가지방식을지원 RMI 방식 자바에서기본적으로제공하는 RMI를사용 검증된안전한기술 JGroups 방식 UDP 기반의라이브러리 JBoss Session Clustering JMS 방식 JMS 메시지를이용하여데이터동기화
Ehcache 가이드 : Cache 동기화 캐시동기화방식 (RMI 방식 )
Ehcache 가이드 : Cache 동기화 환경설정 : NODE 식별정책 (RMI 방식 )
Ehcache 가이드 : Cache 동기화 환경설정 : NODE 식별정책 (RMI 방식 ) CacheManagerPeerProvider Node 식별을위해필요한설정 RMICacheManagerPeerProviderFactory 제공 CacheManagerPeerListener 데이터수신을위해필요한설정 RMICacheManagerPeerListenerFactory 제공 CacheEventLisenver 각 Cache 별로동기화방식설정
Ehcache 가이드 : Cache 동기화 환경설정 : NODE 식별정책 (RMI 방식 ) Node 식별을위해 UDP 방식이나 TCP 방식을선택할수있다. UDP 방식 peerdiscovery = automatic Node 추가시설정파일의변경이필요없다. 네트워크에서멀티캐스트를허용해야한다. TCP 방식 peerdiscovery = manual Node 추가시설정파일의변경이필요하다.
Ehcache 가이드 : Cache 동기화 환경설정 : 캐시동기화정책 (RMI 방식 )
Ehcache 가이드 : Cache 동기화 환경설정 : 캐시동기화정책 (RMI 방식 ) replicateputs = false // 정보가추가되었을때동기화여부 replicateupdates = false // 정보가수정되었을때동기화여부 replicateremovals = true // 정보가삭제되었을때동기화여부 replicateasynchronously = false // 동기화작업의 Async 여부 replicateupdatesviacapy = false // 복제데이터를보낼지삭제메시지를보낼지여부
CACHE 모니터링
CACHE 모니터링 TOMCAT JMX 옵션 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 18001 -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = true -Dcom.sun.management.jmxremote.password.file = /home1/irteam/apps/tomcat/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file = /home1/irteam/apps/tomcat/conf/jmxremote.access
CACHE 모니터링 MBean 설정 <bean id="ehcache" class="org.springframework.cache.ehcache.ehcachemanagerfactorybean" > <property name="configlocation" value="classpath:ehcache.xml"></property> <property name="shared" value="true"/> </bean> <bean id="mbeanserver class="org.springframework.jmx.support.mbeanserverfactorybean"> <property name="locateexistingserverifpossible" value="true"/> </bean> <bean id="managementservice" class="net.sf.ehcache.management.managementservice" init-method="init"> <constructor-arg ref="ehcache"/> <constructor-arg ref="mbeanserver"/> <constructor-arg index="2" value="true"/> <constructor-arg index="3" value="true"/> <constructor-arg index="4" value="true"/> <constructor-arg index="5" value="true"/> </bean>
CACHE 모니터링 Statistics 옵션 <cache name="samplecache" maxelementsinmemory="20000" eternal="false" timetoidleseconds="300" timetoliveseconds="600" overflowtodisk="false" diskpersistent="false" diskexpirythreadintervalseconds="120" memorystoreevictionpolicy="lru" statistics="true"> </cache>
DEMO
DEMO Special Thanks. 아래 SVN 서버에서다운받으세요. https://javacafe-demo.googlecode.com/svn