[java] Kafka Streams와 데이터 스트림의 2PC 및 3PC 방식

이 블로그 포스트에서는 Kafka Streams와 데이터 스트림 처리에 대해 논의하고, 2PC(2-Phase Commit) 및 3PC(3-Phase Commit) 방식을 살펴보겠습니다.

소개

Kafka Streams는 Apache Kafka를 기반으로 한 분산 스트림 처리 플랫폼입니다. 데이터 스트림을 소비하여 실시간으로 처리하고, 결과를 다시 Kafka로 전송할 수 있습니다.

2PC(2-Phase Commit)

2PC(2-Phase Commit)은 분산 환경에서 트랜잭션 처리를 위해 사용되는 클러스터 중심의 프로토콜입니다. 2PC는 다음과 같은 단계로 이루어집니다:

  1. Prepare phase: 트랜잭션 코디네이터는 모든 참가자에게 트랜잭션 수행을 준비하도록 요청합니다. 각 참가자는 변경 사항을 로컬 로그에 기록합니다.

  2. Commit phase: 트랜잭션 코디네이터는 모든 참가자에게 커밋을 수행하도록 요청합니다. 각 참가자는 로컬 로그의 변경 사항을 커밋합니다.

2PC는 트랜잭션의 원자성을 보장할 수 있지만, 장애 발생 시 참가자들이 블록될 수 있고, 전체 시스템의 성능을 저하시킬 수 있습니다.

3PC(3-Phase Commit)

3PC(3-Phase Commit)은 2PC의 단점을 보완한 프로토콜입니다. 3PC는 다음과 같은 단계로 이루어집니다:

  1. CanCommit phase: 트랜잭션 코디네이터는 모든 참가자에게 트랜잭션 수행 가능 여부를 질의합니다. 참가자는 트랜잭션을 수행할 수 있는지 투표합니다.

  2. PreCommit phase: 트랜잭션 코디네이터는 트랜잭션 수행에 동의한 참가자들에게 커밋을 수행하도록 요청합니다. 참가자들은 트랜잭션을 준비해두고, 커밋 또는 롤백 여부를 응답합니다.

  3. DoCommit phase: 트랜잭션 코디네이터는 커밋을 수행할지 롤백을 수행할지 결정합니다. 이 결정은 참가자들의 응답과 현재 시스템 상태에 기반합니다.

3PC는 2PC보다 장애 상황에서의 성능 및 가용성을 향상시킬 수 있지만, 여전히 블록될 수 있으며 결정이 지연될 수 있습니다.

결론

Kafka Streams는 데이터 스트림 처리를 위한 강력한 플랫폼입니다. 트랜잭션 처리를 위해 2PC와 3PC 방식을 사용할 수 있으며, 각 방식은 장단점이 있습니다. 시스템 요구사항과 용도에 맞게 적절한 방식을 선택해야 합니다.

더 자세한 내용은 아래의 참고 자료를 참조하시기 바랍니다.

참고 자료