발행자

완전한 소스 코드: 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 메커니즘

구독자는 메시지로부터의 AckNack를 처리하는 것을 책임집니다. 적절한 구현은 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 구현"을 참조하십시오.