-
xkafka는 Go 환경에서 Kafka를 HTTP 서비스처럼 단순하게 사용할 수 있도록 해주는 오픈소스 라이브러리
- 기존 confluent-kafka-go 사용 시 복잡한 처리 루프와 많은 보일러플레이트 코드가 필요했지만, xkafka는 Handler, Middleware, Message 구조로 핵심 로직에 집중할 수 있게 해줌
-
메시지 발행과 소비를 HTTP 요청/응답 방식처럼 직관적으로 처리하며, 오프셋 관리, 동시성 설정, 에러 핸들링 등 Kafka의 복잡함을 많이 감춰줌
-
Streaming/Batch 처리, 순차/비동기 처리, At-most-once/At-least-once 보장 등 실서비스에서 요구되는 다양한 패턴을 간단히 지원함
-
계층적 에러 처리, 미들웨어 기반 재시도/로깅/메트릭스 등 실무에 필요한 패턴을 쉽게 적용할 수 있음
HTTP-like Kafka
-
xkafka는 Go에서 Kafka를 HTTP 서비스처럼 추상화하는 라이브러리
-
Message는 HTTP 요청과 유사하며, 토픽/파티션/오프셋/키/값/헤더/콜백 등을 포함
-
Handler는 HTTP Handler와 같이 비즈니스 로직을 처리
-
Middleware는 로깅, 메트릭, 재시도 등 부가 기능을 비즈니스 로직과 분리해 적용 가능
메시지 발행 (Publishing Messages)
-
xkafka.NewProducer
로 Producer 생성 후, 메시지 객체를 만들어 Publish
함수로 발행함
- 비동기 발행(AsyncPublish) 및 콜백 등록이 가능해, 고성능이나 비동기 이벤트 처리가 쉬움
- 배경 goroutine에서 메시지 전달을 처리하며, 콜백을 통해 전달 상태를 추적할 수 있음
메시지 소비 (Consuming Messages)
- Consumer 생성 시, Handler 함수와 토픽/브로커/설정 등 지정
-
consumer.Use()
로 미들웨어 추가 가능
-
consumer.Run(ctx)
로 메시지 소비를 시작함
Streaming vs. Batch
-
Streaming: 메시지가 도착할 때마다 즉시 1건씩 처리. 처리량이 적거나 메모리 절약, 강한 처리 보장에 유리함
-
Batch: 일정 개수 혹은 시간 단위로 묶어서 처리. 고처리량 시스템이나 다운스트림 부담 완화에 유리함
Sequential or Async
- 기본은 순차 처리(Sequential) — 하나 처리 끝나야 다음 메시지 읽음
-
xkafka.Concurrency(N)
사용 시 N개의 메시지(또는 배치)를 동시 처리하는 비동기(Async) 모드 지원
오프셋 관리
- Kafka 기본 동작은 메시지 전달 즉시 오프셋을 앞으로 이동시키므로, 장애 시 메시지 유실 가능성이 있음
- xkafka는
enable.auto.offset.store=false
로 설정하여, 메시지(혹은 배치) 처리 완료 후에만 오프셋 저장함
- 별도의 DB나 큐로 메시지 상태를 관리하지 않아도, Kafka에서 처리 보장 가능
-
At-Most-Once Guarantee
- 기본적으로 Kafka의
enable.auto.commit=true
에 따라 백그라운드에서 오프셋 커밋
-
xkafka.ManualCommit(true)
와 순차 처리로, 메시지/배치마다 읽기 전에 오프셋 커밋하여 At-most-once 보장
-
At-Least-Once Guarantee
-
xkafka.ManualCommit(true)
와 동시성(N>1)을 결합해, 병렬 처리 중에도 오프셋을 동기적으로 순서대로 커밋
-
At-least-once 보장 패턴을 쉽게 적용 가능
에러 핸들링
-
Handler 레벨
- Handler 내에서 애플리케이션 에러 처리 및 Dead Letter Queue로 전송 등 가능
- 성공 시
msg.AckSuccess()
, 스킵 시 msg.AckSkip()
, 실패 시 msg.AckFail(err)
등 명시적으로 제어
-
Middleware 레벨
- 미들웨어에서 재시도, 에러 로깅 등 공통 로직을 여러 Handler에 재사용 가능
- 다양한 에러에 따라 다른 재시도 정책이나 처리 방법을 손쉽게 적용
-
Global 레벨
- Kafka 브로커/라이브러리 에러는 필수 옵션인
xkafka.ErrorHandler
에서 중앙 처리
- 이 핸들러가 non-nil 에러 반환 시 Consumer/Producer 동작을 중단
결론
-
xkafka는 Apache Kafka의 복잡한 사용 경험을 Go 개발자에게 친숙한 HTTP 서버 구조로 바꿔줌
- 불필요한 보일러플레이트를 줄이고, 비즈니스 로직에만 집중할 수 있는 환경을 제공
- 기존 confluent-kafka-go 코드 대비 훨씬 간결하고 직관적임
- 공식 문서와 예제를 참고해 바로 시작 가능