ข้อความ
ข้อความเป็นหนึ่งในส่วนหลักของ Watermill ข้อความจะถูกเผยแพร่โดย "ผู้เผยแพร่" และถูกรับโดย "ผู้สมัคร". เมื่อประมวลผลข้อความ หากการประมวลผลล้มเหลว คุณควรส่ง Ack()
(แสดงถึงการประมวลผลเรียบร้อย) หรือ Nack()
(แสดงถึงความล้มเหลวในการประมวลผล)
การดำเนินการ Ack
และ Nack
ของข้อความถูกจัดการโดยผู้รับ (ในการดำเนินการเริ่มต้น ผู้สมัครจะรอ Ack
หรือ Nack
)
ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
type Message struct {
// UUID เป็นตัวระบุที่ไม่ซ้ำกันของข้อความ
//
// ใช้สำหรับการดีบักจากด้านของ Watermill
// UUID อาจว่างเปล่า
UUID string
// Metadata ประกอบด้วยเมตาดาต้าของข้อความ
//
// สามารถใช้เพื่อเก็บข้อมูลที่ไม่จำเป็นต้องถอดรหัสจากข้อความทั้งหมด
// คล้ายกับส่วนหัวของคำขอ HTTP
//
// Metadata จะถูก 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 เป็น idempotent
// คืนค่าเป็นเท็จหาก Nack ถูกส่งไปแล้ว
func (m *Message) Ack() bool {
// ...
Nack
ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Nack ส่งคำขอตอบรับที่เป็นลบสำหรับข้อความ
//
// Nack ไม่บล็อค
// Nack เป็น idempotent
// คืนค่าเป็นเท็จหาก Ack ถูกส่งไปแล้ว
func (m *Message) Nack() bool {
// ...
การรับ Ack/Nack
ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/docs/content/docs/message/receiving-ack.go
// ...
เลือก {
กรณี
Context
ข้อความมี context ของมาตรฐานของไลบรารีเท่ากับคำขอ HTTP
ซอร์สโค้ดเต็ม: github.com/ThreeDotsLabs/watermill/message/message.go
// ...
// Context คืนค่า context ของข้อความ หากต้องการเปลี่ยน context ให้ใช้ SetContext
//
// Context ที่คืนมาคือเสมอไม่เป็นค่าว่าง ค่าเริ่มต้นคือ context พื้นหลัง
func (m *Message) Context() context.Context {
if m.ctx != nil {
return m.ctx
}
return context.Background()
}
// SetContext ตั้งค่า context ที่ให้มาเป็น context ของข้อความ
func (m *Message) SetContext(ctx context.Context) {
m.ctx = ctx
}
// ...