발행자
완전한 소스 코드: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Publisher interface {
// 주어진 메시지를 지정된 주제에 발행합니다.
//
// 발행은 동기적 또는 비동기적일 수 있습니다. 이는 구현에 따라 다릅니다.
//
// 대부분의 발행자 구현은 원자적 메시지 발행을 지원하지 않습니다.
// 이는 하나의 메시지를 발행하는 도중에 실패하면 다음 메시지가 발행되지 않음을 의미합니다.
//
// Publish는 스레드 안전해야 합니다.
Publish(topic string, messages ...*Message) error
// 발행자가 비동기적인 경우 Close는 전송되지 않은 메시지를 플러시해야 합니다.
Close() error
}
// ...
다수의 메시지 발행
대부분의 발행자 구현은 원자적 메시지 발행을 지원하지 않습니다. 이는 하나의 메시지를 발행하는 도중에 실패하면 다음 메시지가 발행되지 않음을 의미합니다.
비동기적 발행
발행은 동기적 또는 비동기적일 수 있습니다. 이는 구현에 따라 다릅니다.
Close()
만약 발행자가 비동기적인 경우, Close
는 전송되지 않은 메시지를 플러시해야 합니다. 구독자를 닫는 것을 잊지 마세요. 그렇지 않으면 일부 메시지가 손실될 수 있습니다.
구독자
완전한 소스 코드: github.com/ThreeDotsLabs/watermill/message/pubsub.go
// ...
type Subscriber interface {
// 제공된 주제에서 메시지가 포함된 출력 채널을 반환합니다.
// 구독자를 닫을 때 채널이 닫힙니다.
//
// 다음 메시지를 받으려면 수신한 메시지에대해 `Ack()`를 호출해야 합니다.
// 만약 메시지 처리가 실패하고 메시지를 재전송해야하는 경우 `Nack()`를 호출해야 합니다.
//
// 제공된 ctx가 취소되면 구독자는 구독을 닫고 출력 채널을 닫습니다.
// 제공된 ctx는 생성된 모든 메시지에 설정됩니다.
// Ack 또는 Nack이 메시지에 호출되면 메시지의 context가 취소됩니다.
Subscribe(ctx context.Context, topic string) (
}
Ack/Nack 메커니즘
구독자는 메시지로부터의 Ack
와 Nack
를 처리하는 것을 책임집니다. 적절한 구현은 Ack
또는 Nack
을 기다려야 합니다.
중요한 구독자 구현 팁: Watermill 메시지에서 Ack를 받은 후에는 반드시 Ack/오프셋을 메시지의 저장소/에이전트로 전송해야 합니다. 그렇지 않으면 메시지를 처리하기 전에 프로세스가 종료된다면 메시지가 손실될 수 있습니다.
Close()
Close
는 모든 구독을 닫고 그들의 출력 채널을 닫으며 필요한 경우 오프셋을 플러시합니다.
적어도 한 번 전달
Watermill은 적어도 한 번 전달 시맨틱을 사용하여 구축되었습니다. 이는 메시지 처리 시 오류가 발생하고 Ack
를 보낼 수 없는 경우 해당 메시지가 재전달될 것임을 의미합니다.
이 사항을 염두에 두고 응용 프로그램을 동일한 처리 또는 재시도 메커니즘을 구현해야 합니다.
유감스럽게도 일반적인 재시도 미들웨어를 만드는 것이 불가능하기 때문에 직접 구현하는 것을 권장합니다.
일반적인 테스트
모든 Pub/Sub는 대부분의 측면에서 유사합니다. 각 Pub/Sub 구현에 대해 별도의 테스트를 작성하는 것을 피하기 위해 모든 Pub/Sub가 통과해야 하는 테스트 스위트를 만들었습니다.
이러한 테스트는 pubsub/tests/test_pubsub.go
에서 찾을 수 있습니다.
내장 구현
사용 가능한 Pub/Sub 구현을 확인하려면 지원되는 Pub/Sub을 참조하십시오.
사용자 정의 Pub/Sub 구현
새로운 Pub/Sub을 지원하는 방법에 대한 지침은 "사용자 정의 Pub/Sub 구현"을 참조하십시오.