사용자 지정 발행자/구독자 인터페이스
사용자 정의 발행자/구독자를 지원하려면 message.Publisher
및 message.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) (
할 일 목록
잊지 말아야 할 몇 가지 사항은 다음과 같습니다:
- 로깅 (적절한 메시지와 적절한 수준).
- 교체 가능하고 구성 가능한 메시지 인코더.
- 발행자 및 구독자의
Close()
구현은 다음과 같아야 합니다:- 동일한 동작을 여러 번 수행해도 동일한 결과를 만들어야 함
- 발행자 또는 구독자가 차단된 경우에도 제대로 작동해야 함 (예: Ack를 기다리는 경우)
- 구독자의 출력 채널이 차단된 경우에도 제대로 작동해야 함 (수신 대기 중이 아무도 없는 경우)
- 소비된 메시지에 대한
Ack()
및Nack()
지원. -
Nack()
을 사용하여 소비된 메시지의 재전달 지원. - 일반적인 발행자/구독자 테스트 사용. 디버깅 팁은 테스트 문제 해결 가이드를 참조해야 합니다.
- 성능 최적화.
- GoDocs, 마크다운 설명 및 입문 예제의 지원.