Pulsar 트랜잭션이란?
Pulsar 트랜잭션이란?
Pulsar 트랜잭션은 Apache Pulsar의 메시지 전달 의미(semantics)와 Pulsar Functions의 처리 보장을 한 단계 끌어올리는 기능이에요. 트랜잭션 API를 쓰면 여러 토픽에 걸쳐 쓰기(write)와 확인(acknowledgment)을 원자적으로 처리할 수 있어요. 쉽게 말해 "모두를 한 번에 성공시키거나, 아무것도 성공시키지 않거나"를 보장하는 메시지 배치를 만들 수 있는 거죠.
출처: 문서
본문
트랜잭션은 Apache Pulsar의 메시지 전달 의미와 Pulsar Functions의 처리 보장을 강화해요. Pulsar 트랜잭션 API는 여러 토픽에 걸친 원자적 쓰기와 확인(ack)을 지원해요.
트랜잭션을 사용하면 다음과 같은 일을 할 수 있어요.
- 프로듀서가 여러 토픽에 메시지 배치를 보낼 때, 그 배치의 모든 메시지가 어떤 컨슈머에게든 결국 모두 보이거나, 아니면 어떤 컨슈머에게도 절대 보이지 않게 할 수 있어요.
- 종단 간 정확히 한 번(exactly-once) 의미를 제공할 수 있어요(컨슘-처리-프로듀스 작업을 정확히 한 번 실행).
트랜잭션 의미 (Transaction semantics)
Pulsar 트랜잭션은 다음과 같은 의미를 가져요.
- 트랜잭션 내의 모든 작업은 하나의 단위로 커밋돼요. 모든 메시지가 커밋되거나, 아니면 아무것도 커밋되지 않아요. 각 메시지는 정확히 한 번 쓰이거나 처리되며, (장애가 발생해도) 데이터 손실이나 중복이 없어요. 트랜잭션이 중단(abort)되면 그 트랜잭션의 모든 쓰기와 확인 작업이 롤백돼요.
- 한 트랜잭션에 속한 메시지 그룹은 여러 파티션에서 수신되고, 생산되고, 확인될 수 있어요. 컨슈머는 커밋된(확인된) 메시지만 읽을 수 있어요. 다시 말해, 브로커는 열려 있는(open) 트랜잭션의 일부인 트랜잭션 메시지나, 중단된(aborted) 트랜잭션의 일부인 메시지를 전달하지 않아요. 여러 파티션에 걸친 메시지 쓰기는 원자적이에요. 여러 서브스크립션에 걸친 메시지 확인(ack)도 원자적이에요. 컨슈머가 트랜잭션 ID로 메시지를 확인할 때, 그 메시지는 해당 서브스크립션 아래에서 컨슈머에 의해 정확히 한 번만 성공적으로 확인돼요.
트랜잭션과 스트림 처리 (Transactions and stream processing)
Pulsar에서 스트림 처리는 Pulsar 토픽에 대한 "컨슘-처리-프로듀스"(consume-process-produce) 작업이에요.
- 컨슘(Consume): Pulsar 컨슈머를 실행하는 소스 오퍼레이터가 하나 이상의 Pulsar 토픽에서 메시지를 읽어요.
- 처리(Process): 처리 오퍼레이터가 메시지를 변환해요.
- 프로듀스(Produce): Pulsar 프로듀서를 실행하는 싱크 오퍼레이터가 결과 메시지를 하나 이상의 Pulsar 토픽에 써요.
Pulsar 트랜잭션은 종단 간 정확히 한 번 스트림 처리를 지원해요. 다시 말해 소스 오퍼레이터에서 메시지가 손실되지 않고, 싱크 오퍼레이터로 메시지가 중복되지 않아요.
사용 사례 (Use case)
Pulsar 2.8.0 이전에는 Pulsar로 정확히 한 번 처리 보장을 갖춘 스트림 처리 애플리케이션을 만드는 쉬운 방법이 없었어요. Pulsar 2.8.0에서 트랜잭션이 도입되면서, 다음 서비스들이 정확히 한 번 의미를 지원하게 됐어요.
- Pulsar Flink 커넥터: Pulsar 2.8.0 이전에 Flink와 Pulsar를 써서 스트림 애플리케이션을 만들고 싶다면, Pulsar Flink 커넥터는 정확히 한 번 소스 커넥터와 최소 한 번(at-least-once) 싱크 커넥터만 지원했어요. 그래서 종단 간 최고 처리 보장이 최소 한 번이었고, 스트리밍 애플리케이션의 결과 메시지가 Pulsar의 결과 토픽에 중복으로 만들어진 가능성이 있었죠. Pulsar 2.8.0에서 트랜잭션이 도입되면서, Pulsar Flink 싱크 커넥터는 지정된
TwoPhaseCommitSinkFunction을 구현하고 Flink 싱크 메시지 라이프사이클을 Pulsar 트랜잭션 API에 연결함으로써 정확히 한 번 의미를 지원할 수 있게 됐어요. - Pulsar Functions와 다른 커넥터에 대한 지원은 향후 릴리스에서 추가될 예정이에요.
더 알아보기 (Learn more)
- Pulsar 트랜잭션: 왜 필요한가요? — 트랜잭션이 왜 도입됐는지, idempotent producer의 한계를 살펴봐요.
- 트랜잭션 사용하기 — 트랜잭션을 실제로 사용하는 방법을 알아봐요.
- 트랜잭션 고급 기능 — 트랜잭션의 고급 기능을 확인해요.
- 트랜잭션 동작 원리 — 트랜잭션이 내부에서 어떻게 동작하는지 살펴봐요.
- Pulsar Functions — Pulsar의 스트림 처리 단위인 Functions를 알아봐요.