DOP의 동시성 관리
일반적으로 다중 스레드 환경에서 동시성을 관리하기 위해 임계 영역(Critical Section) 접근 작업을 뮤텍스와 같은 잠금 장치로 보호한다. 보호 대상에는 읽기 영역도 포함되는데 그 이유는 읽기 도중에 다른 스레드에 의해 값이 변경되어 일관성을 잃을 수 있기 때문이다.
하지만 DOP에서 읽기 작업은 다중 스레드를 고려하지 않아도 된다. 그 이유는 DOP에서 데이터는 불변이기 때문이다. 즉, 다른 작업에 의해 값이 변해도 문제가 없다. 그렇다면 쓰기 작업의 경우 어떨까?
DOP에서는 쓰기 작업에서도 잠금을 사용하는 대신 더 원자라는 단순한 구조를 사용한다. DOP의 쓰기는 사진과 같은 단계를 거치는데 상태가 변경됐는가? 부분에서 원자적으로 비교 후 상태를 반영한다. 이때 언어 별로 이런 동작을 지원하는 구현체가 이미 존재하거나 외부 라이브러리를 활용할 수 있다.
# Class: Concurrent::Atom
# 초기값 생성
atom = Concurrent::Atom.new(1)
# compare_and_set(old_value, new_value)
# old_value가 일치하기 때문에 2로 변경이 된다;
atom.compare_and_set(1, 2);
# old_value가 일치하지 않기 때문에 3으로 변경에 실패한다.
atom.compare_and_set(1, 3);
최근 Ruby를 사용하고 있기 때문에 Ruby의 기능으로 알아보자. Concurrent::Atom을 활용하면 DOP의 원자를 쉽게 구현할 수 있다.
내 생각
원자를 활용하면 확실히 성능적인 손실을 방지할 수 있을 것 같다. 하지만 많은 작업 상황에서 많은 스레드가 while문을 돌며 스냅샷을 생산해내면 서버에 어떤 영향을 줄지도 궁금하다. 또한 2개 이상의 서버가 동작하는 상황에서 어떻게 해야할지도 궁금하다. 이 의문은 지금 메모리에서 관리하는 데이터를 결국 DB에 어떻게 저장하느냐와도 연관된 것 같은데 좀 더 읽어나가다 보면 궁금증이 풀리지 않을까 싶다.
'도서 > 기술' 카테고리의 다른 글
[책] 데이터 지향 프로그래밍 - 10, 11장 데이터 베이스 작업과 웹 서비스 (1) | 2025.01.25 |
---|---|
[책] 데이터 지향 프로그래밍 - 9장 영속 자료구조 (2) | 2024.12.22 |
[책] 데이터 지향 프로그래밍 - 7장 기본 데이터 유효성 확인 (1) | 2024.12.15 |
[책] 데이터 지향 프로그래밍 - 6장 단위 테스트 (2) | 2024.12.14 |
[책] 데이터 지향 프로그래밍 - 5장 기본 동시성 제어 (1) | 2024.12.08 |