사용자 지정 발행자/구독자 인터페이스

사용자 정의 발행자/구독자를 지원하려면 message.Publishermessage.Subscriber 인터페이스를 구현해야 합니다.

완전한 소스 코드: github.com/ThreeDotsLabs/watermill/message/pubsub.go

// ...
type Publisher interface {
    // Publish는 지정된 주제로 제공된 메시지를 발행합니다.
    //
    // 구현에 따라 Publish는 동기적으로 또는 비동기적으로 실행될 수 있습니다.
    //
    // 대부분의 발행자 구현은 원자적인 메시지 게시를 지원하지 않습니다.
    // 이는 한 메시지의 게시에 실패하면 다음 메시지가 발행되지 않음을 의미합니다.
    //
    // Publish는 스레드 안전해야 합니다.
    Publish(topic string, messages ...*Message) error
    // 발행자가 비동기적인 경우 Close는 보내지지 않은 메시지를 플러시해야 합니다.
    Close() error
}

// Subscriber는 발행자/구독자의 소비 부분입니다.
type Subscriber interface {
    // Subscribe는 제공된 주제에서 수신된 메시지를 위한 출력 채널을 반환합니다.
    // Close()가 구독자에게 호출되면 채널이 닫힙니다.
    //
    // 다음 메시지를 수신하려면 수신된 메시지에 Ack()를 호출해야 합니다.
    // 메시지 처리가 실패하고 메시지를 재전달해야하는 경우 Nack()을 호출해야 합니다.
    //
    // 제공된 ctx이 취소되면 구독자는 구독을 종료하고 출력 채널을 닫습니다.
    // 제공된 ctx은 생성된 모든 메시지에 설정됩니다.
    // 메시지에서 Nack 또는 Ack를 호출하면 메시지의 컨텍스트가 취소됩니다.
    Subscribe(ctx context.Context, topic string) (

할 일 목록

잊지 말아야 할 몇 가지 사항은 다음과 같습니다:

  1. 로깅 (적절한 메시지와 적절한 수준).
  2. 교체 가능하고 구성 가능한 메시지 인코더.
  3. 발행자 및 구독자의 Close() 구현은 다음과 같아야 합니다:
    • 동일한 동작을 여러 번 수행해도 동일한 결과를 만들어야 함
    • 발행자 또는 구독자가 차단된 경우에도 제대로 작동해야 함 (예: Ack를 기다리는 경우)
    • 구독자의 출력 채널이 차단된 경우에도 제대로 작동해야 함 (수신 대기 중이 아무도 없는 경우)
  4. 소비된 메시지에 대한 Ack()Nack() 지원.
  5. Nack()을 사용하여 소비된 메시지의 재전달 지원.
  6. 일반적인 발행자/구독자 테스트 사용. 디버깅 팁은 테스트 문제 해결 가이드를 참조해야 합니다.
  7. 성능 최적화.
  8. GoDocs, 마크다운 설명 및 입문 예제의 지원.