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

简介: 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
}
// ...


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1451 103
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
429 43
Go语言深度解析:从入门到精通的完整指南
|
4月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
360 0
|
8月前
|
算法 Go 索引
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
本文详细解析了力扣第45题“跳跃游戏II”的三种解法:贪心算法、动态规划和反向贪心。贪心算法通过选择每一步能跳到的最远位置,实现O(n)时间复杂度与O(1)空间复杂度,是面试首选;动态规划以自底向上的方式构建状态转移方程,适合初学者理解但效率较低;反向贪心从终点逆向寻找最优跳点,逻辑清晰但性能欠佳。文章对比了各方法的优劣,并提供了Go语言代码实现,助你掌握最小跳跃次数问题的核心技巧。
333 15
|
3月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
3月前
|
Linux Go iOS开发
IDA 9.2 发布:Golang 改进、新 UI 组件、类型解析等
IDA Pro 9.2 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
724 0
|
4月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
337 0
|
4月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
6月前
|
存储 设计模式 安全
Go 语言单例模式全解析:从青铜到王者段位的实现方案
单例模式确保一个类只有一个实例,并提供全局访问点,适用于日志、配置管理、数据库连接池等场景。在 Go 中,常用实现方式包括懒汉模式、饿汉模式、双重检查锁定,最佳实践是使用 `sync.Once`,它并发安全、简洁高效。本文详解各种实现方式的优缺点,并提供代码示例与最佳应用建议。
203 5
|
7月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
384 26

推荐镜像

更多