kakasoo

2PC를 이용한 분산 트랜잭션 본문

프로그래밍/Backend

2PC를 이용한 분산 트랜잭션

카카수(kakasoo) 2023. 7. 14. 22:53
반응형

외부 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 모델을 따르기 때문에 성능 상 이점을 포기해야 한다.

반응형