Pulsar 트랜잭션

Pulsar 트랜잭션 (Transactions)

트랜잭션 의미론(semantics)은 이벤트 스트리밍 애플리케이션이 메시지를 소비하고, 처리하고, 생성하는 것을 하나의 원자적(atomic) 작업으로 수행하게 해줘요. Pulsar에서 프로듀서나 컨슈머는 여러 토픽과 파티션에 걸친 메시지를 다루면서 그 메시지들이 하나의 단위로 처리되도록 보장할 수 있어요. 트랜잭션을 이해하는 데 필요한 개념들을 함께 살펴볼게요.

출처: 문서

본문

트랜잭션 코디네이터와 트랜잭션 로그 (Transaction coordinator and transaction log)

트랜잭션 코디네이터는 트랜잭션에 참여하는 토픽과 구독을 관리해요. 트랜잭션이 커밋되면 트랜잭션 코디네이터가 토픽 소유 브로커와 상호작용해 트랜잭션을 완료해요.

트랜잭션 코디네이터는 트랜잭션의 전체 생명주기를 관리하고 트랜잭션이 잘못된 상태가 되는 것을 방지해요.

트랜잭션 코디네이터는 트랜잭션 타임아웃을 처리하고, 트랜잭션 타임아웃 후에는 트랜잭션이 중단(abort)되도록 보장해요.

모든 트랜잭션 메타데이터는 트랜잭션 로그에 영속화돼요. 트랜잭션 로그는 Pulsar 토픽이 백엔드로 동작해요. 트랜잭션 코디네이터가 크래시한 뒤에도 트랜잭션 로그에서 트랜잭션 메타데이터를 복원할 수 있어요.

트랜잭션 ID (Transaction ID)

트랜잭션 ID(TxnID)는 Pulsar에서 고유한 트랜잭션을 식별해요. 트랜잭션 ID는 128비트예요. 가장 높은 16비트는 트랜잭션 코디네이터 ID용으로 예약되고, 나머지 비트는 각 트랜잭션 코디네이터에서 단조 증가하는 숫자로 사용돼요. TxnID로 트랜잭션 크래시 위치를 쉽게 찾을 수 있어요.

트랜잭션 버퍼 (Transaction buffer)

트랜잭션 내에서 생성된 메시지는 트랜잭션 버퍼에 저장돼요. 트랜잭션 버퍼의 메시지는 트랜잭션이 커밋되기 전까지 컨슈머에게 구체화(visible)되지 않아요. 트랜잭션이 중단되면 트랜잭션 버퍼의 메시지는 폐기돼요.

보류 확인 상태 (Pending acknowledge state)

트랜잭션 내의 메시지 확인(acknowledge)은 트랜잭션이 완료되기 전까지 보류 확인 상태(pending acknowledge state)가 관리해요. 메시지가 보류 확인 상태에 있으면 그 메시지가 보류 확인 상태에서 제거될 때까지 다른 트랜잭션이 그 메시지를 확인할 수 없어요.

보류 확인 상태는 보류 확인 로그에 영속화돼요. 보류 확인 로그는 Pulsar 토픽이 백엔드로 동작해요. 새 브로커는 보류 확인 로그에서 상태를 복원해 확인이 유실되지 않도록 보장할 수 있어요.

성능 최적화 (Performance Optimizations)

트랜잭션 로그 배칭 (Transaction Log Batching)

Pulsar는 성능을 높이고 트랜잭션 상태 유지 오버헤드를 줄이기 위해 트랜잭션 로그에 대한 배치 쓰기를 지원해요. 활성화하면 여러 트랜잭션 로그 항목이 스토리지에 쓰기 전에 함께 배치되어 I/O 연산을 줄이고 처리량을 높여요.

핵심 구성 파라미터:

  • transactionLogBatchedWriteEnabled: 트랜잭션 로그에 대한 배치 쓰기 활성화
  • transactionLogBatchedWriteMaxRecords: 한 배치의 최대 레코드 수
  • transactionLogBatchedWriteMaxSize: 한 배치의 최대 크기(바이트)
  • transactionLogBatchedWriteMaxDelayInMillis: 배치를 플러시하기 전 최대 대기 시간

보류 확인 배칭 (Pending Acknowledgment Batching)

많은 수의 보류 확인을 처리할 때 성능을 높이기 위해 Pulsar는 보류 확인 작업의 배칭을 지원해요. 이는 높은 처리량의 트랜잭션 워크로드에서 보류 ack 상태 유지 오버헤드를 줄여줘요.

세그먼트형 트랜잭션 버퍼 스냅샷 (Segmented Transaction Buffer Snapshots)

많은 수의 중단(aborted) 트랜잭션을 효율적으로 처리하기 위해 Pulsar는 세그먼트형 스냅샷 기능을 구현했어요. 이 기능은 중단된 트랜잭션이 많은 시나리오를 다룰 때 트랜잭션 버퍼 스냅샷을 더 효과적으로 관리해요.

이점:

  • 트랜잭션 버퍼의 메모리 관리 개선
  • 트랜잭션 규모가 큰 중단 시나리오 처리 개선
  • 트랜잭션 복구를 위한 스냅샷 오버헤드 감소

트랜잭션 버퍼 성능 튜닝 (Transaction Buffer Performance Tuning)

최근 개선 사항에는 성능 튜닝을 위한 향상된 트랜잭션 버퍼 구성이 포함돼요.

  • 버퍼 크기 최적화: 다양한 워크로드 패턴에 맞춰 구성 가능한 버퍼 크기
  • 배치 처리: 트랜잭션 버퍼 내 배칭 개선
  • 메모리 관리: 트랜잭션 데이터를 위한 더 나은 메모리 할당 전략

트랜잭션 격리와 일관성 (Transaction Isolation and Consistency)

읽기 커밋 격리 (Read Committed Isolation)

Pulsar 트랜잭션은 읽기 커밋(read committed) 격리 수준을 제공하며 다음을 보장해요.

  • 컨슈머는 커밋된 트랜잭션의 메시지만 볼 수 있어요
  • 커밋되지 않은 메시지는 트랜잭션 커밋까지 보이지 않아요
  • 중단된 트랜잭션의 메시지는 자동으로 폐기돼요

파티션 간 일관성 (Cross-Partition Consistency)

Pulsar의 트랜잭션은 일관성을 유지하면서 여러 토픽과 파티션에 걸칠 수 있어요.

  • 원자적 커밋: 트랜잭션 내 모든 작업이 함께 성공하거나 실패해요
  • 코디네이터 관리 상태: 트랜잭션 코디네이터가 파티션 간 일관된 상태를 보장해요
  • 장애 복구: 코디네이터 장애 후에도 시스템이 일관된 상태로 복구할 수 있어요

트랜잭션 타임아웃과 복구 (Transaction Timeouts and Recovery)

타임아웃 관리 (Timeout Management)

트랜잭션 코디네이터는 무기한으로 매달려 있는 트랜잭션을 방지하기 위해 트랜잭션 타임아웃을 처리해요.

  • 구성 가능한 타임아웃: 다양한 사용 사례에 맞춰 적절한 타임아웃 값을 설정
  • 자동 중단: 트랜잭션이 타임아웃을 초과하면 자동으로 중단
  • 리소스 정리: 타임아웃된 트랜잭션의 리소스는 자동으로 정리

코디네이터 복구 (Coordinator Recovery)

트랜잭션 코디네이터가 실패하면 복구 메커니즘이 트랜잭션 일관성을 보장해요.

  • 상태 복원: 트랜잭션 로그에서 트랜잭션 상태 복원
  • 진행 중 트랜잭션 처리: 복구 중 진행 중인 트랜잭션을 적절히 처리
  • 메타데이터 일관성: 코디네이터 재시작 간 트랜잭션 메타데이터 일관성 유지

구성과 모범 사례 (Configuration and Best Practices)

핵심 구성 파라미터 (Key Configuration Parameters)

핵심 트랜잭션 설정 (Core Transaction Settings)
  • transactionCoordinatorEnabled: 브로커에서 트랜잭션 코디네이터 활성화 (기본값: false)
  • transactionMetadataStoreProviderClassName: 트랜잭션 메타데이터 저장소 제공자 클래스 (기본값: org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStoreProvider)
  • transactionBufferProviderClassName: 트랜잭션 버퍼 제공자 클래스 (기본값: org.apache.pulsar.broker.transaction.buffer.impl.TopicTransactionBufferProvider)
  • transactionPendingAckStoreProviderClassName: 트랜잭션 보류 ack 저장소 제공자 클래스 (기본값: org.apache.pulsar.broker.transaction.pendingack.impl.MLPendingAckStoreProvider)
배치 쓰기 설정 (Batched Write Settings)
  • transactionLogBatchedWriteEnabled: 효율성 향상을 위한 배치 트랜잭션 로그 쓰기 활성화 (기본값: false)
  • transactionLogBatchedWriteMaxRecords: 한 배치의 최대 로그 레코드 수 (기본값: 512)
  • transactionLogBatchedWriteMaxSize: 한 배치의 최대 바이트 크기 (기본값: 4194304 - 4 MB)
  • transactionLogBatchedWriteMaxDelayInMillis: 배치의 첫 레코드 최대 대기 시간 (기본값: 1)
  • transactionPendingAckBatchedWriteEnabled: 보류 ack 저장소에 대한 배치 쓰기 활성화 (기본값: false)
버퍼 및 스냅샷 설정 (Buffer and Snapshot Settings)
  • transactionBufferSegmentedSnapshotEnabled: 많은 수의 중단 트랜잭션 처리를 위한 세그먼트형 버퍼 스냅샷 활성화 (기본값: false)
  • transactionBufferSnapshotMaxTransactionCount: 이 트랜잭션 작업 수 이후 스냅샷 생성 (기본값: 1000)
  • transactionBufferSnapshotMinTimeInMillis: 스냅샷 생성 간격(밀리초) (기본값: 5000)
  • transactionBufferSnapshotSegmentSize: 스냅샷 세그먼트 크기(바이트) (기본값: 262144 - 256 KB)
성능 및 제한 (Performance and Limits)
  • maxActiveTransactionsPerCoordinator: 코디네이터당 최대 활성 트랜잭션 수 (기본값: 0 - 제한 없음)
  • numTransactionReplayThreadPoolSize: 트랜잭션 리플레이용 스레드 풀 크기 (기본값: CPU 코어 수)
  • transactionBufferClientMaxConcurrentRequests: 버퍼 클라이언트의 최대 동시 요청 수 (기본값: 1000)
  • transactionBufferClientOperationTimeoutInMills: 버퍼 클라이언트 작업 타임아웃(밀리초) (기본값: 3000)

성능 고려 사항 (Performance Considerations)

  • 배치 크기 튜닝: 워크로드 특성에 맞춰 배치 크기 최적화
  • 코디네이터 배치: 트랜잭션 코디네이터를 적절히 분산 배치
  • 리소스 할당: 트랜잭션 처리를 위한 충분한 리소스 확보
  • 모니터링: 성능 최적화를 위해 트랜잭션 지표 모니터링

자세한 구성과 사용 예제는 Pulsar transactions 문서를 참고해요.

더 알아보기 (Learn more)