이벤트 기반 아키텍처와 메시징을 Go로 구현하는 Watermill

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

DevOps

대상자

Go 언어를 사용하는 이벤트 기반 아키텍처 개발자, 특히 Kafka, RabbitMQ 등 메시징 시스템을 활용하는 시스템 개발자

핵심 요약

  • Watermill은 Kafka, RabbitMQ 등 다양한 메시징 브로커를 추상화하여 단일 API로 통합 관리
  • Publisher, Subscriber, Router, Middleware 4가지 핵심 컴포넌트로 이벤트 처리 파이프라인 구축 가능
  • 고성능 처리 (초당 수십만 메시지 처리) 및 플러그인 기반 미들웨어 (로깅, 리트라이 등) 지원

섹션별 세부 요약

1. Watermill 개요

  • 이벤트 기반 아키텍처의 장점: 시스템 간 결합도 감소, 수평 확장성 향상
  • Watermill은 Kafka, RabbitMQ, Redis Streams 등 주요 브로커를 지원하며, API 일관성 제공
  • 복잡한 브로커 로직을 숨기고, 메시지 퍼블리싱/서브스크라이브 기능만 제공

2. 핵심 컴포넌트

  • Publisher: 메시지를 특정 토픽에 발행 (예: publisher.Publish("exemplo.topico", msg))
  • Subscriber: 토픽에 등록된 메시지를 소비 (예: subscriber.Subscribe(context.Background(), "exemplo.topico"))
  • Router: 메시지 라우팅 및 미들웨어 적용
  • Middleware: 로깅, 리트라이, 제한 속도 등 전반적인 기능 확장

3. 지원 브로커 및 예제

  • 공식 지원 브로커: Kafka, RabbitMQ, Google Pub/Sub, AWS SNS/SQS, Redis Streams, SQL, GoChannel, HTTP
  • 예제 코드: Kafka를 사용한 퍼블리셔/서브스크라이버 구현 (Docker로 로컬 테스트 가능)
  • 중요 설정: Brokers, Marshaler, ConsumerGroup

4. 활용 사례 및 장점

  • 미들웨어 기반 확장성: 로깅, 메트릭 수집 (Prometheus 연동 가능)
  • 성능: Go의 동시성 모델을 활용한 고속 처리
  • 유연성: 브로커 교체 시 코드 변경 없이 지원 (예: Kafka → RabbitMQ)

결론

  • 로컬 테스트를 위해 Docker로 Kafka 실행 후 퍼블리셔/서브스크라이버 실행
  • 이벤트 기반 시스템 구축 시 Watermill을 통해 복잡한 브로커 로직을 추상화 가능
  • 고성능, 확장성, 유연성을 갖춘 Go 기반 이벤트 처리 라이브러리로 추천