728x90
동시성 문제 해결 방법
- Synchronized 이용
- RDB Lock 활용
- Redis 활용 (Lettuce or Redisson)
Synchronized 이용
- Synchronized 키워드를 통하여 메소드 해당 블럭을 동기화처리를 함
- Synchronized가 선언된 블럭에는 동시에 하나의 스레드만 접근이 가능하기 때문에 동시성 문제를 해결가능
- 하지만 Synchronzied를 통하여 해결하는 방법은 단일 인스턴스일 경우에만 가능함, 예를 들어서 데이터에 여러개의 인스턴스가 접근하는 경우에는 다수의 인스턴스가 접근이 가능하기 때문에 레이스컨디션이 발생함 (실무에서는 거의 사용되지 않는 방법)
RDB Lock 활용
Lock 종류
종류 | 특징 |
Pessmistic Lock | 실제로 데이터에 Lock을 걸어 정합성을 맞추는 방법, Lock을 걸게되면 다른 트랜잭션에서 Lock이 해제되기전에 데이터를 가져올 수 없음, 데드락이 걸릴 수 있기 때문에 주의해야함 |
Optimistic Lock | 실제 Lock을 이용하지 않고 버전을 이용함으로써 정합성을 맞추는 방법, 먼저 데이터를 읽고 update를 수행시 현재 읽은 버전이 맞는지 확인하여 버전을 업데이트를 함, 읽은 버전에 수정사항이 생겼을 경우 다시 읽은 후에 작업을 수행해야함 |
Named Lock | 이름을 가진 Lock을 획득한 후 해제할때까지 다른 세션에서 해당 Lock을 획득하지 못하게 하는 방법, 트랜잭션이 종료될 때까지 Lock이 자동으로 해제 되지 않기 때문에, 별도로 해제를 수행해주거나, 선점시간이 끝나야 해제가 됨 |
Redis 활용
Redis Lock 지원방식 종류
종류 | 특징 |
Lettuce | setnx 명렁어를 활용하여 분산락 구현 spin lock 방식이기 때문에 Retry 로직을 별도로 구현해야함 spin lock : lock을 사용하려는 스레드가 lock을 사용할 수 있는지 반복적으로 요청해서 lock 획득을 시도하는 방식, 반복적으로 요청하기 때문에 부하가 갈 수 있음 구현이 간단함 |
Redisson | pub- sub 방식으로 Lock 구현을 제공, spin lock 방식보다는 부하가 덜감 lock 획득 재시도를 기본적으로 제공함 별도의 라이브러리르 사용해야 하기 때문에 구현이 Lettuce보다는 간단하지 않음 |
- 재시도가 필요하지 않은 경우엔 Lettuce를 활용
- 재시도가 필요한 경우는 Redisson을 활용
- 상황에 맞는 지원방식을 사용
요약
- 분삭락 구현 같은 경우는 성능은 역시 Redis가 좋음, 인프라 관리가 여유가 있으면 Redis 사용, 그렇지 않은 상황이면 그냥 RDB로 구현
'OTHER' 카테고리의 다른 글
[OTHER] 헥사고날 아키텍처 (0) | 2022.09.06 |
---|---|
[OTHER] 멱등성 (0) | 2022.04.25 |
[OTHER] Semantic Versioning (0) | 2022.04.07 |
[OTHER] TDD (테스트 주도 개발론) (0) | 2021.11.14 |
[OTHER] 마이크로 서비스 아키텍처 (0) | 2021.09.28 |