AWS DynamoDB 를 이용한 동시성 충돌 처리

2024. 4. 1. 00:00AWS

반응형

aws DynamoDB 도 동시성 충돌 문제가 생긴다. 

여러 사용자가 사용하기 때문에 동시에 특정 data 에 접근하게 되고

이렇게 되면 동시성 충돌에 문제가 생긴다.

 

이제 그 문제를 해결 하는 방법을 알아보자 

 

이전 강좌에서 data 를 저장하는 방법을 알아봤다. 

https://yogingang.tistory.com/479

 

AWS DynamoDB 를 이용한 data 저장

AWS 에는 KeyValue 기반의 NoSQL Data Service 가 있다. DynamoDB 라고 한다. .NET 에서 AWS DynamoDB 를 사용하여 Table 을 생성하고 CRUD 하는 간단한 app 을 만들어 보겠다. DynamoDB 를 이용하여 Programming 하는 방법에

yogingang.tistory.com

이 model 을 기준으로 작업해 보자

 

User 모델을 조금 수정할 것이다. 

User.cs

[DynamoDBTable("User")]
public class User
{
    [DynamoDBHashKey] // Primary Key
    public Guid Id { get; set; } = Guid.NewGuid();

    [DynamoDBProperty]
    public string Name { get; set; }

    [DynamoDBProperty]
    public string Password { get; set; }

    [DynamoDBProperty]
    public string Email { get; set; }

    [DynamoDBProperty]
    public int Age { get; set; }
    [DynamoDBVersion] // attribute 를 추가해주자
    public int? Version { get; set; } //<-- 충돌 check 를 위해 version 이 추가 되었다. 
}

Handler.cs

 public class CommandHandler(IMapper mapper, IDynamoDBContext dbContext)
 {
     private readonly IMapper _mapper = mapper;
     private readonly IDynamoDBContext _dbContext = dbContext;

     public async Task<Response> Handle(Command command)
     {
         while (true)
         {
             var user = await _dbContext.LoadAsync<Infrastructure.Models.Dynamo.User>(command.Id);
             user.Name = $"Concurrency Conflict Resolved {DateTime.Now}";
             //var user = _mapper.Map<Infrastructure.Models.Dynamo.User>(command);
             try
             {
                 await _dbContext.SaveAsync(user);
                 return new Response { Result = true };
             }
             catch (ConditionalCheckFailedException ex)
             {
                 Console.WriteLine(ex.ToString());
             }
         }
     }
 }

 

Handler 를 확인 하면 try catch 구문에서 ConditionalCheckFailedException 이 발생하는 것을 알수 있다. 

 

이게 발생하면 간단한 logging 정도 하고 다시 LoadAsync 를 실행하여 최신 data 를 가져온 후 적용하면 된다. 

 

 

관련영상

https://youtu.be/GvjVvbWFtCw

반응형

'AWS' 카테고리의 다른 글

AWS DynamoDB 를 이용한 data 저장  (0) 2024.03.25