AWS DynamoDB 를 이용한 동시성 충돌 처리
2024. 4. 1. 00:00ㆍAWS
반응형
aws DynamoDB 도 동시성 충돌 문제가 생긴다.
여러 사용자가 사용하기 때문에 동시에 특정 data 에 접근하게 되고
이렇게 되면 동시성 충돌에 문제가 생긴다.
이제 그 문제를 해결 하는 방법을 알아보자
이전 강좌에서 data 를 저장하는 방법을 알아봤다.
https://yogingang.tistory.com/479
이 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 를 가져온 후 적용하면 된다.
관련영상
반응형
'AWS' 카테고리의 다른 글
AWS DynamoDB 를 이용한 data 저장 (0) | 2024.03.25 |
---|