메시지
메시지는 Watermill의 핵심 부분 중 하나입니다. 메시지는 "게시자"에 의해 발행되고 "구독자"에 의해 수신됩니다. 메시지 처리 시, 처리가 실패하면 Ack()
(성공적인 처리를 나타냄) 또는 Nack()
(처리 실패를 나타냄)을 보내어야 합니다.
메시지의 Ack
와 Nack
는 구독자가 처리합니다 (기본 구현에서 구독자는 Ack
또는 Nack
를 기다립니다).
전체 소스 코드: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
type Message struct {
// UUID는 메시지의 고유 식별자입니다.
//
// Watermill에 의해 디버깅에 사용됩니다.
// UUID는 비어 있을 수 있습니다.
UUID string
// Metadata는 메시지의 메타데이터를 포함합니다.
//
// 전체 페이로드에서 디코딩할 필요가 없는 데이터를 저장하는 데 사용할 수 있습니다.
// 이는 HTTP 요청 헤더와 유사합니다.
//
// 메타데이터는 marshaled되어 PubSub에 저장됩니다.
Metadata Metadata
// Payload는 메시지의 페이로드입니다.
Payload Payload
// ack는 승인을 받으면 닫힙니다.
// noAck는 부정적인 승인을 받으면 닫힙니다.
ack chan struct{}
noAck chan struct{}
ackMutex sync.Mutex
ackSentType ackType
ctx context.Context
}
// ...
Ack
Ack
보내기
전체 소스 코드: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Ack는 메시지에 대한 승인을 보냅니다.
//
// Ack는 블록되지 않습니다.
// Ack는 멱등성을 가집니다.
// Nack가 이미 보내졌을 경우 false를 반환합니다.
func (m *Message) Ack() bool {
// ...
Nack
전체 소스 코드: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Nack은 메시지에 대한 부정적인 승인을 보냅니다.
//
// Nack은 블록되지 않습니다.
// Nack은 멱등성을 가집니다.
// Ack가 이미 보내졌을 경우 false를 반환합니다.
func (m *Message) Nack() bool {
// ...
Ack/Nack
받기
전체 소스 코드: github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go
// ...
select {
case
컨텍스트
메시지에는 HTTP 요청과 마찬가지로 표준 라이브러리의 컨텍스트가 포함됩니다.
전체 소스 코드: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Context는 메시지의 컨텍스트를 반환합니다. 컨텍스트를 변경하려면 SetContext를 사용합니다.
//
// 반환된 컨텍스트는 항상 nil이 아니며, 기본값은 백그라운드 컨텍스트입니다.
func (m *Message) Context() context.Context {
if m.ctx != nil {
return m.ctx
}
return context.Background()
}
// SetContext는 제공된 컨텍스트를 메시지의 컨텍스트로 설정합니다.
func (m *Message) SetContext(ctx context.Context) {
m.ctx = ctx
}
// ...