ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Arcus
    Java & Spring/기타 2021. 9. 30. 15:23
    반응형

    Arcus 란?

    • memcached와 ZooKeeper를 기반으로 네이버 서비스들의 요구 사항을 반영해 개발한 메모리 캐시 클라우드
      • memcached 프로토콜을 지원하고 기본 성능 혜택은 그대로 유지
        • 백엔드 저장소인 DB 앞단에 위치하여 hot-spot 성격의 데이터를 캐싱하여, 서비스 응용에 빠른 응답성을 제공하고 DB 부하를 감소시킴
        • 복잡한 계산에 의한 결과물 or 웹 처리 상의 중간 데이터 등을 신속하게 저장 / 조회
        • 캐시를 통한 여러 프로세스들 간에 데이터 공유

    Front Cache

    • 리모트 캐시 앞단에서 애플리케이션 장비의 로컬 메모리를 사용하여 데이터를 캐싱하는 방법
      • ARCUS와 같이 리모트 서버에서 캐싱을 수행하면 캐싱된 데이터를 서로 공유할 수 있지만, 일시적인 많은 요청으로 인한 장비 리소스 부족, 과다한 트래픽 발생에 따라 데이터 응답 시간이 민감하게 영향을 받음
        • 클러스터 확장, 장비 사양 업그레이드 등이 해결책이 될 수 있지만 운영 비용이 증가
      • Front Cache를 통해 소프트웨어 단에서 적은 비용으로 해결 가능
      • 로컬 메모리에 캐싱한다고 하여 로컬 캐시(Local Cache)라고도 부름
      • 네트워크를 통해 외부 서버에 캐싱하는 것보다 훨씬 빠름
        • 트래픽에 영향 X
        • Spring Framework의 Spring Cache를 ARCUS에 맞추어 구현한 ARCUS Spring 라이브러리 1.13.3 버전에서 프론트 캐시를 위한 인터페이스를 추가
    • Arcus의 Front Cache는 Ehcache를 이용
      • Java EE 및 경량 컨테이너를위한 오픈 소스 Java 분산 캐시
      • 특징
        • 경량의 빠른 캐시 엔진
        • 확장(scable) - 메모리 & 디스크 저장 지원, 멀티 CPU의 동시 접근에 튜닝
        • 분산 지원 - 동기/비동기 복사, 피어(peer) 자동 발견
        • 높은 품질 - Hibernate, Confluence, Spring 등에서 사용되고 있으며, Gaia 컴포넌트에서도 EHCache를 사용하여 캐시를 구현함

    연결 관련 Exception

    • NotExistsServiceCodeException
      • Admin 주소 or service code를 잘못 설정한 경우
      • 설정 파일을 확인
    • TimeoutException
      • 대부분 JVM GC 때문에 발생
        • timeout이 연속적으로 발생하고 connection이 재설정 되는지 확인 (로그에 "exceeded continuous timeout threshold"이 남고, "Cancelled"가 여러 개 보인다.)
        • timeout이 발생할 때의 GC 시간 확인
        • Timeout값이 너무나 작게 설정되지 않았나 확인한다. 시간의 단위도 반드시 확인한다.
      • 예상 원인
        • Application 시작 이후, 충분한 Warm up 전 요청이 몰리는 경우
        • 지정된 timeout 값이 GC 시간보다 작은 경우
        • Arcus client 한 개로 요청을 처리하기 벅찬 경우
      • 해결책
        • Full GC 시간을 측정하고 GC 튜닝을 한다
        • Timeout 값을 조정한다. (간헐적인 timeout은 무시)
        • TimeoutException은 재시도가 가능 ~> 재시도 로직을 만듦
        • Arcus client pool을 사용
    • ExecutionException
      • Arcus와의 연결이 끊기고 모든 대기 중인 요청이 cancle됨
      • 예상 원인
        • Arcus와의 연결에서 timeout exception이 n번 이상 발생 ~> 자바 클라이언트는 연결에 문제가 있다고 판단하고 재연결을 시도
          • continuous timeout threshold의 default는 10회
          • timeout이 연속적으로 발생하여 연결을 재설정 하는 과정에 일시적으로 발생
        • Arcus 서버 or Arcus 서버 간 네트워크 문제
      • 해결책
        • timeout이 연속적으로 발생하는 원인을 파악하여 조치(권장)
        • continuous timeout exception threshold값을 조절
    • Can’t serialize null
      • Arcus 값 저장 시, null을 저장할 수 없음
      • null을 저장하지 않도록 한다. (Arcus에서 key miss가 발생하면 null이 반환된다.)
      • 삭제는 null을 저장하지 않고 delete API를 사용한다
    • IllegalArgumentException("Non-serializable object")
      • 예상 원인
        • Arcus java client가 기본값으로 사용하는 Transcoder는 SerializingTranscoder로 non-serializable객체를 serialize할 수 없음
      • 해결책
        • 저장하려는 객체에 Serializable 인터페이스를 구현
        • non-serialize 객체를 encode/decode할 수 있는 customized transcoder를 만들어서 사용
    • SERVER_ERROR Out of memory
      • 예상 원인
        • Arcus 서버 구동 시 지정한 sticky item 영역 고갈 or 영역을 지정하지 않음
      • 해결책
        • Sticky item 영역의 용량 산정을 다시 설정
    • 값이 저장되지 않음
      • 예상 원인
        • 만료시간을 30일 이상으로 지정하면 Unix time으로 변환 시, 과거의 시간이 되어 즉시 만료됨
          • 조회해보면 만료된 아이템으로 취급되어 null이 반환됨
        • 만료 시간을 밀리 초로 지정한 경우
          • 만료시간은 ‘초’ 단위로 지정해야 함
        • 조회하는 key와 저장하는 key가 서로 다른 경우
      • 해결책
        • expire time값을 변경
        • 로그를 통해 저장하는 key와 조회하는 key가 동일한지 확인
        • Future객체의 getOperationStatus()로 결과 코드를 확인

    REFERENCE

    반응형

    댓글

Designed by Tistory.