[SPRING] Spring / EHCache로로드 중 캐시 새로 고치기
SPRINGSpring / EHCache로로드 중 캐시 새로 고치기
데이터베이스 백엔드 및 EHCache 기반 캐싱을 사용하는 스프링 다중 스레드 웹 서비스에 캐싱 문제가 있습니다. 이 서비스에는 여러 클라이언트가 모두 한 번에 같은 요청을 반복하여 요청하며 수십 건의 요청이 있습니다. 자주 요청되는 개체가 두 개뿐입니다. 다른 개체가 자주 요청되지 않는 경우가 많습니다. 개체는 몇 분마다 바뀔 수 있으므로 캐시의 TTL은 1 분으로 설정됩니다. 데이터베이스에서 개체로드가 느리고 적어도 몇 초가 걸립니다.
처음에는 객체를 가져 오기 위해 순진 구현을 사용했습니다.
이것은 처음에 로컬에서 테스트 할 때 잘 작동했습니다. 그러나 더 빠른 서버에서 성능 테스트를 수행하면 요청 빈도가 높은 객체 중 하나가 캐시에서 만료 될 때마다로드가 급격히 악화되는 것으로 나타났습니다. 이런 일이 발생하면 다음 10 초 동안 첫 번째 스레드가 데이터베이스로드를 완료하고 새 개체를 캐시에 넣을 때까지 해당 개체에 대한 모든 요청이 데이터베이스로드로 이어집니다. 결과는 짧지 만 데이터베이스에 대한 부하가 높았으며 요청이 완료되기를 기다려야하는 많은 사용자가있었습니다.
현재 구현 된 개체가 현재로드되고 있는지 여부를 추적하여 데이터베이스로드를 향상시킵니다.
이 구현을 사용하면 객체가 만료 되더라도 하나의 데이터베이스 작업 만 있습니다. 또한 데이터베이스로드가 낮기 때문에 더 빨리 완료됩니다. 그러나 여전히 개체로드 중에 개체를 요청한 모든 사용자가 기다려야 함을 의미합니다.
내가 정말로 원하는 것은 오직 첫 번째 쓰레드 만 데이터베이스로드를 기다리고 다른 모든 객체는 객체가로드되는 동안 '만료 된'객체를 반환한다는 것입니다. 응답 시간은 객체가 너무 오래되었다는 사실보다 나에게 중요합니다.
또는 개체가 몇 초 내에 만료됨을 알 때 비동기 적으로 캐시를 새로 고칠 수 있습니다. EHCache의 단일 TTL 모델에 더 가깝고 아무도 데이터베이스로드를 기다릴 필요가 없다는 것을 의미합니다.
내 진짜 질문은 : 내가 바퀴를 다시 발명하기 전에 이미 Spring / EHCache 환경에서 이와 같은 것을 구현하는 기존 프레임 워크가 있습니까? 또는 어쩌면 이것에 대한 지원은 이미 Spring / EHCache의 어딘가에 존재하며 올바른 옵션을 찾을 수 없습니까?
해결법
-
==============================
1.Ehcache가 제공하는 구조가 두 가지 있습니다.
Ehcache가 제공하는 구조가 두 가지 있습니다.
둘 다 CacheLoader를 구성해야하므로 캐시와 상호 작용하는 방식을 변경해야합니다.
불행히도, 두 번째 옵션에 대한 예제를 보여주는 온라인 설명서를 찾을 수 없습니다. Quartz를 사용하여 캐시 항목을 새로 고침하여 스케줄을 예약 할 수 있습니다. 또한 키 생성기를 기반으로 키의 하위 집합 만 새로 고칠 수 있습니다. net.sf.ehcache.constructs.scheduledrefresh 패키지의 클래스를 살펴보십시오.
-
==============================
2.두 번째 스레드는 아무 것도 없으므로 캐시에서 "만료 된"객체를 얻을 수 없으므로 설계에 결함이 있습니다 (2 단계 : 객체가 캐시에있을 때 즉시 반환).
두 번째 스레드는 아무 것도 없으므로 캐시에서 "만료 된"객체를 얻을 수 없으므로 설계에 결함이 있습니다 (2 단계 : 객체가 캐시에있을 때 즉시 반환).
해결 방법 :
from https://stackoverflow.com/questions/26296035/refreshing-caches-while-under-load-with-spring-ehcache by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Eclipse의 Java 10 컴파일러에서 import javax.annotation. *을 확인할 수 없습니다. (0) | 2019.05.16 |
---|---|
[SPRING] Spring Data JPA + Neo4j를 사용하여 교차 저장소 영속성을 올바르게 설정하는 방법은 무엇입니까? (0) | 2019.05.16 |
[SPRING] 원격 파티션 - 노예 욕심 (0) | 2019.05.16 |
[SPRING] 다중 값 쿼리를 사용하는 스프링 캐시 추상화 (0) | 2019.05.16 |
[SPRING] Mule Zip 파일을 압축하여 FTP 서버로 압축 파일 보내기 (0) | 2019.05.16 |