Azure Storage를 사용하여 분산 시스템 잠금 관리

분산 시스템은 이미 한동안 존재해 왔으며, 이를 설계할 때 잘 알려진 패턴이 이미 확립되어 있습니다. 오늘은 인기 있는 패턴 중 하나인 “잠금(lock)”에 대해 논의하겠습니다.

간단히 말해, 잠금은 프로세스가 특정 작업을 수행하기 위해 자원에 독점적으로 접근하는 방법입니다. 예를 들어, 저장 계정에 여러 개의 블롭이 있고, 중복 처리를 피하기 위해 각 블롭을 처리하기 위해 서비스 인스턴스가 필요하다고 가정해 보겠습니다. 이를 수행하는 방법은 블롭에 대한 잠금을 획득하고 처리를 완료한 후 이를 해제하는 것입니다. 그러나 프로세스가 잠금을 해제하기 전에 실패하면(프로세스가 죽거나 네트워크 파티션으로 인해) 자원이 무한정 잠겨 있게 되는 잠재적인 문제가 발생합니다. 이는 교착 상태와 자원 경합으로 이어질 수 있습니다.

교착 상태를 방지하기 위해 사용할 수 있는 한 가지 전략은 시간 초과 또는 임대 기반 잠금을 사용하는 것입니다.

시간 초과 잠금

  • 이 경우, 프로세스가 잠금을 요청하는 사전 정의된 시간 초과가 있습니다. 시간 초과 전에 잠금이 해제되지 않으면 시스템은 결국 잠금이 해제되도록 보장합니다.

임대 잠금

  • 임대 기반 잠금의 경우, 타임아웃 메커니즘과 함께 임대 갱신 API가 제공됩니다. 잠금을 보유한 프로세스는 임대가 만료되기 전에 이 API를 호출하여 리소스에 대한 배타적 액세스를 유지해야 합니다. 프로세스가 시간 내에 임대를 갱신하지 못하면 잠금이 자동으로 해제되어 다른 프로세스가 획득할 수 있습니다.

타임아웃과 임대 기반 잠금의 장단점

Pros Cons
타임아웃 기반 잠금 구현하기 쉬움 타임아웃을 신중하게 선택해야 함
영구 잠금 방지 처리가 완료되지 않으면 임대 갱신 방법이 없음
임대 기반 잠금 조기 잠금 만료 위험 감소 임대 갱신 메커니즘 필요

작업이 완료될 때까지 프로세스는 계속해서 임대를 요청할 수 있음

위의 두 전략은 분산 시스템에서 프로세스 실패나 네트워크 분할로부터 빠르게 회복하는 방법입니다.

Azure Storage로 임대 잠금 전략 사용하기

Azure Storage에서 임대 잠금 전략을 사용하는 방법을 살펴보겠습니다. 이것은 타임아웃 잠금 전략도 포함합니다.

1단계: Storage Blob Nuget 가져오기

이 글을 작성할 당시 “12.23.0”이 최신 버전입니다. 최신 버전은 Azure Storage Blobs에서 찾을 수 있습니다.

XML

 

2단계: 임대 획득

아래는 임대를 획득하는 코드입니다.

C#

 

  1. 먼저, Blob Container Client를 만들고 특정 blob에 대한 Blob Client를 가져옵니다.
  2. 둘째, “Acquire Async” 메서드는 특정 기간 동안 임대를 획득하려고 시도합니다. 획득이 성공하면 임대 ID가 반환되고, 그렇지 않으면 409 (충돌 상태 코드)가 발생합니다.
  3. “Acquire Async”는 여기에 중요한 메서드입니다. 나머지 코드는 필요에 따라 맞춤화/수정할 수 있습니다.

3단계: 임대 갱신

  • “Renew Async”는 임대를 갱신하는 데 사용되는 Storage .NET SDK의 메서드입니다.
  • 갱신이 실패하면 실패 원인과 함께 예외가 발생합니다.
C#

 

4단계: 임대 획득 및 갱신 메서드 조정

  • 최초에는 “Try Acquire Lease Async”를 호출하여 단계 2에서 임대 식별자를 가져옵니다. 성공적으로 완료되면, 백그라운드 작업이 시작되어 단계 3에서 “Renew Lease Async”를 X초마다 호출합니다. 타임아웃과 임대 갱신 방법 호출 사이에 충분한 시간이 있는지 확인하십시오.
C#

 

  • 취소 토큰은 더 이상 필요하지 않을 때 임대 갱신 작업을 원활하게 중지하는 데 사용됩니다.

단계 5: 임대 갱신 취소

  • “Cancel Async” 메서드가 호출되면 단계 4의 “IsCancellationRequested”가 true가 되어 더 이상 while 루프에 들어가지 않고 임대 갱신을 요청하지 않습니다.
C#

 

단계 6: 임대 해제

마지막으로, 임대를 해제하려면 “Release Async” 메서드를 호출하십시오.

C#

 

결론

잠금은 분산 시스템에서 리소스에 대한 독점적인 액세스를 얻기 위한 기본적인 패턴 중 하나입니다. 작업이 원활하게 실행되도록하기 위해 이러한 것들을 다룰 때 함정을 염두에 두는 것이 필요합니다. Azure Storage를 사용하여 무한 블로킹을 방지하고 동시에 잠금 유지 방법에 탄력성을 제공할 수 있는 효율적인 잠금 메커니즘을 구현할 수 있습니다.

Source:
https://dzone.com/articles/locks-in-distributed-systems-timeout-lease-based