반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Crawling
- 크롤링
- Algorithm
- 그래프
- dp
- HTTP 완벽 가이드
- typescript
- HTTP
- 수학
- 타입 챌린지
- BFS
- 자바스크립트
- socket
- 백준
- 문자열
- TCP
- 쉬운 문제
- 소켓
- 타입스크립트
- 프로그래머스
- 알고리즘
- type challenge
- ip
- javascript
- Node.js
- 가천대
- dfs
- Nestjs
- 프로그래머스 레벨 2
- 레벨 1
Archives
- Today
- Total
kakasoo
2PC를 이용한 분산 트랜잭션 본문
반응형
외부 API ( 나의 경우 페이스북, 구글 등 ) 를 이용하는 경우, DB가 분산되어 있는 경우 ACID를 어떻게 보장할까?
첫 번째로 살펴본 것은 2PC ( Two-Phase Commit ) 인데, 예제 코드는 아래와 같다.
이 코드는 각각의 작업 단위를 Node로 정의하여 원자성을 보장해야 하는 것들을 Coordinator에게 전달한다.
2PC 프로토콜은 트랜잭션을 커밋할지 롤백할지 결정하기 위해 모든 Node의 투표 결과를 확인한다.
interface Node {
name: string;
vote: boolean | null;
prepare(): void; // commit할지, rollback할지 투표를 한다.
commit(): void;
rollback(): void;
}
class Coordinator {
nodes: Node[];
constructor(nodes: Node[]) {
this.nodes = nodes;
}
startTransaction(): void {
// Phase 1: Prepare Phase
this.nodes.forEach((node) => node.prepare());
// Phase 2: Commit Phase
const allVotes = this.nodes.map((node) => node.vote);
if (allVotes.every((vote) => vote === true)) {
this.nodes.forEach((node) => node.commit());
console.log('트랜잭션 커밋 완료');
} else {
this.nodes.forEach((node) => node.rollback());
console.log('트랜잭션 롤백');
}
}
}
2PC와 같은 분산 트랜잭션은 나뉘어져 있는 DB에서도 원자성을 유지할 수 있게 해주는 방식이다.
다만, 분산 트랜잭션은 간단하지만, 문제점도 너무 많아서 활용하기가 쉽지 않다.
첫째로, 조정자 노드의 장애나 네트워크 지연은 모든 노드의 작업을 지연시키게 되므로 성능에 문제가 있다.
둘째로, 중앙 집중식 아키텍처이기 때문에 모든 노드가 조정자와 통신해야 해서 통신 부하가 증가한다.
셋째로 대부분의 DB는 ACID 모델을 따르기 때문에 성능 상 이점을 포기해야 한다.
반응형
'프로그래밍 > Backend' 카테고리의 다른 글
github private repository에서 package 배포 (0) | 2023.07.17 |
---|---|
마이크로서비스 분해전략 - NestJS (0) | 2023.07.09 |
콘웨이의 법칙 / 역 콘웨이 전략 ( Reverse Conway maneuver ) (0) | 2023.07.09 |
MSA에 대한 대략적인 내용 (0) | 2023.07.06 |
왜 테스트를 해야 하는가? (0) | 2023.04.28 |