메시지

메시지는 Watermill의 핵심 부분 중 하나입니다. 메시지는 "게시자"에 의해 발행되고 "구독자"에 의해 수신됩니다. 메시지 처리 시, 처리가 실패하면 Ack() (성공적인 처리를 나타냄) 또는 Nack() (처리 실패를 나타냄)을 보내어야 합니다.

메시지의 AckNack는 구독자가 처리합니다 (기본 구현에서 구독자는 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
}
// ...