큐레이터 프레임 워크는 사육사 분산 잠금을 달성하기 위해

 배타적 잠금 (X)

여기에 주로 배타적 잠금 분산 잠금에 대해 이야기합니다. 배타적 로크는 쓰기 잠금 또는 잠금 배타적으로 알려진 (X 잠금이라고 배타적 잠금은), 로크는 기본형이다. O1 만 T1을 허용 트랜잭션 T1 데이터 객체 O1 플러스 배타적 잠금, 잠금의 다음 기간은 읽고 다른 트랜잭션에 대한 업데이트 데이터가 조작 O1, 직선 T1 릴리스의 모든 유형이 될 수있는 경우 독점 잠금.

정의 잠금

사육사에서, 잠금 사육사에서 데이터 노드를 생성하여 표현 될 수있다. 예를 들면, / exclusive_lock / 잠금 노드 (znode)는 잠금과 같이 표현 될 수있다.

잠금 획득

단독 잠금을 얻기 위해 요구에서 할 수있는 모든 클라이언트는 임시 자식 노드 / exclusive_lock 노드에서 / exclusive_lock / 잠금을 생성, () 인터페이스를 만들려고하지만, 강력한 일관성 사육사 결승전은 하나의 고객을 보장합니다 성공적으로 클라이언트가 잠금을 획득 한 후 것을 만들었습니다. 동시에, 잠금을 획득하는 모든 클라이언트 거래는 대기 상태에있을 수 있습니다, 자식 노드 변경 감시자을 등록 할 수 있습니다 사전에 클라이언트의 대기 상태는 자식 노드의 상황을 변경하기 위해 실시간으로 모니터하기 위해, / exclusive_lock 노드에서 수신합니다.

잠금을 해제

 

수입 java.util.concurrent.TimeUnit을;
수입 lombok.Cleanup;
수입 lombok.SneakyThrows;
수입 org.apache.curator.RetryPolicy;
수입 org.apache.curator.framework.CuratorFramework;
수입 org.apache.curator.framework.CuratorFrameworkFactory;
수입 org.apache.curator.framework.recipes.locks.InterProcessMutex;
수입 org.apache.curator.retry.ExponentialBackoffRetry;
수입 org.apache.zookeeper.data.Stat; 


공용  클래스 ZkLock { 

  @SneakyThrows 
  공공  정적  무효 메인 (문자열 []에 args) { 

    마지막= 문자열 커넥트 "로컬 호스트를 : 로컬 호스트 2181 : 2182, 로컬 호스트 : 2,183가" ; 

    // 전략을 시도 각 사이에 필요한 대기 시간은 초기화, 1 초 대기 시간 기준을 시도. 
    RetryPolicy = RetryPolicy 새로운 새로운 ExponentialBackoffRetry (1000 ,. 3 ); 

    // 사용 기본 세션 시간 (60초)와 연결 시간 (15초) 클라이언트 사육사 만들 
    @Cleanup CuratorFramework 클라이언트 = CuratorFrameworkFactory.builder을 (). 
        커넥트 (커넥트) . 
        connectionTimeoutMs ( * 1000 15 .) 
        sessionTimeoutMs ( 60 * 100 ). 
        retryPolicy (retryPolicy). 
        ) (빌드; 

    // 클라이언트 시작 
    client.start를 (); 

    최종 문자열 lockNode = "/ lock_node"; 
    InterProcessMutex 잠금 = 새로운 InterProcessMutex (클라이언트, lockNode);
    시도 {이
       // 가 사용할 때까지 차단 - 1. 획득 뮤텍스를. 
      () lock.acquire; 

      // 또는 

      // 2. 획득 뮤텍스 - 차단이 가능한, 또는 지정된 시간이 만료 될 때까지. 
      경우 (lock.acquire (60 , TimeUnit.MINUTES)) { 
        합계 합계 = client.checkExists () forPath (lockNode).;
        경우 ( 널 (null) ! = 합계) {
           // 도트 트랜잭션 
        } 
      } 
    } 마지막으로{
       경우 (lock.isAcquiredInThisProcess ()) { 
        lock.release (); 
      } 
    } 
  } 

}

 

추천

출처www.cnblogs.com/frankyou/p/11412394.html