Watermill(Golang 事件驱动库)核心部件 Message 解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: Watermill(Golang 事件驱动库)核心部件 Message 解析

Message


Message(消息)是 Watermill 的核心部分之一。消息由发布者发出,由订阅者接收。当消息被处理时,您应该在处理失败时发送 Ack()Nack()

AckNack 由订阅者处理(在默认实现中,订阅者等待 AckNack)。

完整源码:

  • github.com/ThreeDotsLabs/watermill/message/message.go


// ...
type Message struct {
    // UUID 是消息的唯一标识符。
   //
   // 它仅由 Watermill 用于调试。
   // UUID 可以为空。
   UUID string
    // Metadata 包含消息元数据。
   //
   // 可以用于存储不需要对整个有效负载 unmarshaling 的数据。
   // 它类似于 HTTP 请求的头。
   //
   // Metadata 将被 marshal,并将保存到 PubSub。
   Metadata Metadata
    // Payload 是消息的有效负载。
   Payload Payload
    // 当收到确认时,ack 关闭。
   ack chan struct{}
    // noACk is closed, when negative acknowledge is received.
    // 当收到否定应答时,noACk 关闭。
   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 <-msg.Acked():
        log.Print("ack received")
    case <-msg.Nacked():
        log.Print("nack received")
    }
// ...


Context


Message 包含标准库上下文,就像 HTTP 请求一样。

完整源码:

  • github.com/ThreeDotsLabs/watermill/message/message.go


// ...
// Context 返回消息的上下文。要更改上下文,使用 SetContext。
//
// 返回的上下文总是非空的;它默认为 background context.。
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
}
// ...


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
46 4
|
2月前
|
数据采集 JavaScript API
网页解析库:BeautifulSoup与Cheerio的选择
网页解析库:BeautifulSoup与Cheerio的选择
|
2月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
2月前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
22 3
|
2月前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
17 2
|
2月前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
112 0
|
2月前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####
|
3月前
|
SQL Oracle 关系型数据库
SQL整库导出语录:全面解析与高效执行策略
在数据库管理和维护过程中,整库导出是一项常见的需求,无论是为了备份、迁移还是数据分析,掌握如何高效、准确地导出整个数据库至关重要
|
2月前
|
Go
|
3月前
|
Linux 编译器 Go
cgo--在Go中链接外部C库
cgo--在Go中链接外部C库

推荐镜像

更多
下一篇
开通oss服务