Skip to content

DefaultConnectionFactory 클래스와 ConnectionFactoryBuilder 클래스의 차이점

uhm0311 edited this page Oct 18, 2024 · 3 revisions

개요

ArcusClient 객체 생성 시 DefaultConnectionFactory 객체, 혹은 ConnectionFactoryBuilder 객체를 필요로 합니다. 이 객체들은 ArcusClient의 내부 동작에 대한 다양한 매개변수와 플래그를 설정할 수 있습니다. 하지만 용도에 따라 두 객체의 사용이 달라져야 합니다.

DefaultConnectionFactory

ArcusClient 클래스의 생성자를 통해 ArcusClient 객체 생성 시 필요로 하는 객체입니다.

InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211);
ArcusClient client = new ArcusClient(new DefaultConnectionFactory(), Collections.singletonList(address));

DefaultConnectionFactory 클래스는 ZooKeeper를 사용하는 ARCUS 캐시 클러스터가 아닌, 고정된 크기의 캐시 서버 목록에 연결할 때 사용합니다. 내부의 매개변수와 플래그는 모두 기본 값으로 설정되어 있으며, 이를 변경하기 위해서는 DefaultConnectionFactory 클래스를 상속받는 별도의 클래스를 생성하여 Getter 메소드의 반환 값을 수정해야 합니다.

DefaultConnectionFactory 클래스는 고정된 크기의 캐시 서버 목록에 연결하기 위해 필요하기 때문에, 내부 매개변수와 플래그가 ARCUS 캐시 클러스터의 동작과 맞지 않는 부분이 있습니다.

ConnectionFactoryBuilder

ArcusClient 클래스의 public static 메소드를 통해 ArcusClient 객체 생성 시 필요로 하는 객체입니다.

ArcusClient client = ArcusClient.createArcusClient("127.0.0.1:2181", "service_code", new ConnectionFactoryBuilder());

ConnectionFactoryBuilder 클래스는 ARCUS 캐시 클러스터에 연결할 때 사용합니다. Builder 패턴을 사용하여 내부의 매개변수와 플래그를 설정할 수 있고, 기본 값으로 설정할 경우 ARCUS 캐시 클러스터의 동작과 잘 맞도록 설계되어 있습니다.

구체적인 차이점

두 클래스는 일부 매개변수의 기본 값에 차이가 있으며, 이는 아래와 같습니다.

failureMode

failureMode 매개변수는 캐시 연산 실패 시 어떤 동작을 수행할 것인지를 나타냅니다.

  • DefaultConnectionFactory - Redistribute : 연산 실패 시 다음 캐시 서버에게 연산 재요청
  • ConnectionFactoryBuilder - Cancel : 연산 실패 시 연산 취소. ARCUS 캐시 클러스터에 연산을 반복적으로 재요청하면 서버에 과도한 부하가 발생할 수 있어 항상 취소하도록 설정

hashAlg

hashAlg 매개변수는 캐시 키 문자열에 대한 해시 값을 생성할 알고리즘을 선택합니다.

  • DefaultConnectionFactory - NATIVE_HASH : String#hashCode() 메소드를 사용합니다.
  • ConnectionFactoryBuilder - KETAMA_HASH : MD5 알고리즘 기반의 Consistent Hashing을 수행하여 ARCUS 캐시 클러스터의 해시 링을 생성

locator

locator 매개변수는 캐시 서버가 여러 개일 경우, 이를 어떤 방식으로 관리하고 특정 캐시 키를 어떤 캐시 서버에 요청할 지를 결정합니다.

  • DefaultConnectionFactory - ArrayModNodeLocator : ArcusClient 생성자에 입력한 캐시 서버 주소 목록과 동일한 순서의 배열로 캐시 서버 목록을 관리하며, 주어진 캐시 키의 String#hashCode() % nodes.length 값으로 연산을 요청할 캐시 서버 선택
  • ConnectionFactoryBuilder - ArcusKetamaNodeLocator : ZooKeeper에 등록된 cache_list znode를 기반으로 캐시 서버 목록을 가져오며, Consistent Hashing을 수행하여 ARCUS 캐시 클러스터를 해시 링 형태로 관리. 주어진 캐시 키에도 동일한 해싱을 수행하고 해시 링에서 해당 캐시 키를 담당하는 캐시 서버 선택

timeoutExceptionThreshold

timeoutExceptionThreshold 매개변수는 특정 캐시 서버에서 Timeout 오류가 얼마나 많이 연속으로 발생했을 때 해당 캐시 서버와의 연결을 잠시 끊을 것인지를 결정합니다. 단, 아래의 timeoutDurationThreshold 매개변수에 의한 조건을 동시에 만족해야 합니다.

  • DefaultConnectionFactory - 998 : 특정 캐시 서버에서 Timeout 오류가 연속 998회 이상 발생하면 해당 캐시 서버와의 연결을 잠시 끊습니다.
  • ConnectionFactoryBuilder - 10 : 특정 캐시 서버에서 Timeout 오류가 연속 10회 이상 발생하면 해당 캐시 서버와의 연결을 잠시 끊습니다.

timeoutDurationThreshold

timeoutDurationThreshold 매개변수는 특정 캐시 서버에서 Timeout 오류의 연속 발생 횟수가 timeoutExceptionThreshold 값 이상일 때 정말로 연결을 끊을지 확인하는 밀리세컨드 단위의 매개변수입니다. Timeout이 timeoutDurationThreshold 값 이상의 시간동안 지속되면서 연속으로 발생하면 재연결을 시도합니다.

  • DefaultConnectionFactory - 0 : Timeout 오류의 연속 발생 횟수가 timeoutExceptionThreshold 값 이상이면 항상 연결을 끊습니다.
  • ConnectionFactoryBuilder - 1000 : Timeout이 1초 이상 지속되면서 연속으로 timeoutExceptionThreshold 값 이상의 횟수로 발생하면 연결을 끊습니다.

maxReconnectDelay

maxReconnectDelay 매개변수는 캐시 서버와의 연결이 해제된 경우, 얼마나 기다린 후에 재연결을 시도할지를 결정하는 초 단위의 값입니다. 재연결에 실패하면 maxReconnectDelay 값만큼 기다린 후에 재연결 시도를 반복합니다.

  • DefaultConnectionFactory - 30 : 캐시 서버와의 연결이 해제되면 30초 후에 재연결을 시도합니다.
  • ConnectionFactoryBuilder - 1 : 캐시 서버와의 연결이 해제되면 1초 후에 재연결을 시도합니다.