사용자 도구

사이트 도구


java:spymemcached

Spymemcached

비동기 - Async

spymemcached의 대부분의 작업은 비동기로 이루어지는 것으로 보인다. 예를들면 memcachedClient.flush() 같은 경우, flush 직후 바로 memcachedClient.shutdown()을 해버리면 flush가 안된 상태로 끝나버린다.

이는 다음과 같이 해야 올바로 flush가 된다.

final OperationFuture<Boolean> flush = memcachedClient.flush();
while(!flush.isDone()) {
    log.debug("Waiting for flushing.");
    TimeUnit.MILLISECONDS.sleep(20); // 잠시 기다려줌.
}

이 처럼 많은 Operation들이 비동기로 이루어지므로 동기가 중요한 요소에서는 Future를 올바르게 조정해야 한다.

기본 Spring 설정

  <bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">
    <property name="servers" value="host1:11211,host2:11211,host3:11211"/>
    <property name="protocol" value="BINARY"/>
    <property name="transcoder">
      <bean class="net.spy.memcached.transcoders.SerializingTranscoder">
        <property name="compressionThreshold" value="1024"/>
      </bean>
    </property>
    <property name="opTimeout" value="1000"/>
    <property name="timeoutExceptionThreshold" value="1998"/>
    <property name="hashAlg" value="KETAMA_HASH"/>
    <property name="locatorType" value="CONSISTENT"/> 
    <property name="failureMode" value="Redistribute"/>
    <property name="useNagleAlgorithm" value="false"/>
  </bean>

Operation Timeout

  • Full GC 동안 Operation Timeout 이 발생할 수 있다.
  • Full GC 시간을 참조하여 opTimeout 값을 적당하게 늘려준다.

Logger 변경

  • System Property net.spy.log.LoggerImpl 값을 원하는 로거 클래스로 지정해야 한다.
    • Logback에에서 Groovy로 설정할 경우
      System.setProperty('net.spy.log.LoggerImpl', 'net.spy.memcached.compat.log.SLF4JLogger')
  • 로거 클래스는 net.spy.compat.log.Logger 를 구현해야 한다.
  • 공식 Slf4j 로거 : net.spy.memcached.compat.log.SLF4JLogger

incr/decr

  • incr,decr의 경우 Long.MAX_VALUE(9223372036854775807)에 도달할 경우 문제가 발생할 수 있다.
  • Binary 프로토콜 : -9223372036854775808 로 계속된다.
  • ASCII 프로토콜 : 예외가 발생하지만 로그로 찍고나서 -1을 리턴한다. incr을 실행할 때마다 계속 예외가 발생하며 계속해서 -1만 리턴한다.
  • 값을 증가/감소 시키지 않고 읽기만 하기
    • incr/decr 메소드의 by 인자를 0 으로 주며 값 변경 없이 읽기만 수행한다.

기타

java/spymemcached.txt · 마지막으로 수정됨: 2016/12/09 07:56 저자 kwon37xi