# xkafka — Go에서 Kafka를 더 쉽게 사용하는 방법

> Clean Markdown view of GeekNews topic #21952. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=21952](https://news.hada.io/topic?id=21952)
- GeekNews Markdown: [https://news.hada.io/topic/21952.md](https://news.hada.io/topic/21952.md)
- Type: news
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-07-13T09:51:01+09:00
- Updated: 2025-07-13T09:51:01+09:00
- Original source: [medium.com](https://medium.com/gojekengineering/introducing-xkafka-kafka-but-simpler-for-go-91f4ce3edade)
- Points: 10
- Comments: 1

## Summary

**xkafka**는 Go 개발자가 **Kafka**를 마치 **HTTP 서비스**처럼 쉽게 활용할 수 있도록 설계된 오픈소스 라이브러리입니다. 기존보다 훨씬 간결한 **Handler, Middleware, Message 구조**를 제공해 복잡한 코드와 오프셋/동시성/에러 관리의 부담을 줄이고, 메시지의 발행과 소비를 **HTTP 요청/응답 패턴**에 가깝게 구현할 수 있습니다. **Streaming/Batch, 순차/비동기 처리, at-most/at-least-once 보장**과 같이 실서비스에서 요구되는 다양한 패턴을 직관적이고 효율적으로 지원하며, **계층적 에러 핸들링**과 미들웨어 기반 기능 확장도 쉽게 적용 가능합니다. **불필요한 보일러플레이트**를 줄이고 **비즈니스 로직**에 집중할 수 있는 Kafka 환경을 원하는 개발자에게 주목할 만한 선택지입니다.

## Topic Body

- **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** 코드 대비 훨씬 간결하고 직관적임  
- 공식 [문서](https://pkg.go.dev/github.com/gojekfarm/xtools/xkafka)와 [예제](https://github.com/gojekfarm/xtools/tree/main/examples/xkafka)를 참고해 바로 시작 가능

## Comments



### Comment 41335

- Author: penza1
- Created: 2025-07-13T22:19:42+09:00
- Points: 1

흠 golang 에서는  
sarama 가 더 선호되고 있다고 알고 있었는디 말이죠..  
생각보다도 kafka client 는.. 브로커 장애나 예외시 매우 복잡해서  
모든 케이스를 커버 할지 ..
