복붙노트

[SPRING] Spring / EHCache로로드 중 캐시 새로 고치기

SPRING

Spring / EHCache로로드 중 캐시 새로 고치기

데이터베이스 백엔드 및 EHCache 기반 캐싱을 사용하는 스프링 다중 스레드 웹 서비스에 캐싱 문제가 있습니다. 이 서비스에는 여러 클라이언트가 모두 한 번에 같은 요청을 반복하여 요청하며 수십 건의 요청이 있습니다. 자주 요청되는 개체가 두 개뿐입니다. 다른 개체가 자주 요청되지 않는 경우가 많습니다. 개체는 몇 분마다 바뀔 수 있으므로 캐시의 TTL은 1 분으로 설정됩니다. 데이터베이스에서 개체로드가 느리고 적어도 몇 초가 걸립니다.

처음에는 객체를 가져 오기 위해 순진 구현을 사용했습니다.

이것은 처음에 로컬에서 테스트 할 때 잘 작동했습니다. 그러나 더 빠른 서버에서 성능 테스트를 수행하면 요청 빈도가 높은 객체 중 하나가 캐시에서 만료 될 때마다로드가 급격히 악화되는 것으로 나타났습니다. 이런 일이 발생하면 다음 10 초 동안 첫 번째 스레드가 데이터베이스로드를 완료하고 새 개체를 캐시에 넣을 때까지 해당 개체에 대한 모든 요청이 데이터베이스로드로 이어집니다. 결과는 짧지 만 데이터베이스에 대한 부하가 높았으며 요청이 완료되기를 기다려야하는 많은 사용자가있었습니다.

현재 구현 된 개체가 현재로드되고 있는지 여부를 추적하여 데이터베이스로드를 향상시킵니다.

이 구현을 사용하면 객체가 만료 되더라도 하나의 데이터베이스 작업 만 있습니다. 또한 데이터베이스로드가 낮기 때문에 더 빨리 완료됩니다. 그러나 여전히 개체로드 중에 개체를 요청한 모든 사용자가 기다려야 함을 의미합니다.

내가 정말로 원하는 것은 오직 첫 번째 쓰레드 만 데이터베이스로드를 기다리고 다른 모든 객체는 객체가로드되는 동안 '만료 된'객체를 반환한다는 것입니다. 응답 시간은 객체가 너무 오래되었다는 사실보다 나에게 중요합니다.

또는 개체가 몇 초 내에 만료됨을 알 때 비동기 적으로 캐시를 새로 고칠 수 있습니다. EHCache의 단일 TTL 모델에 더 가깝고 아무도 데이터베이스로드를 기다릴 필요가 없다는 것을 의미합니다.

내 진짜 질문은 : 내가 바퀴를 다시 발명하기 전에 이미 Spring / EHCache 환경에서 이와 같은 것을 구현하는 기존 프레임 워크가 있습니까? 또는 어쩌면 이것에 대한 지원은 이미 Spring / EHCache의 어딘가에 존재하며 올바른 옵션을 찾을 수 없습니까?

해결법

  1. ==============================

    1.Ehcache가 제공하는 구조가 두 가지 있습니다.

    Ehcache가 제공하는 구조가 두 가지 있습니다.

    둘 다 CacheLoader를 구성해야하므로 캐시와 상호 작용하는 방식을 변경해야합니다.

    불행히도, 두 번째 옵션에 대한 예제를 보여주는 온라인 설명서를 찾을 수 없습니다. Quartz를 사용하여 캐시 항목을 새로 고침하여 스케줄을 예약 할 수 있습니다. 또한 키 생성기를 기반으로 키의 하위 집합 만 새로 고칠 수 있습니다. net.sf.ehcache.constructs.scheduledrefresh 패키지의 클래스를 살펴보십시오.

  2. ==============================

    2.두 번째 스레드는 아무 것도 없으므로 캐시에서 "만료 된"객체를 얻을 수 없으므로 설계에 결함이 있습니다 (2 단계 : 객체가 캐시에있을 때 즉시 반환).

    두 번째 스레드는 아무 것도 없으므로 캐시에서 "만료 된"객체를 얻을 수 없으므로 설계에 결함이 있습니다 (2 단계 : 객체가 캐시에있을 때 즉시 반환).

    해결 방법 :

  3. from https://stackoverflow.com/questions/26296035/refreshing-caches-while-under-load-with-spring-ehcache by cc-by-sa and MIT license