Golang 语言编写的消息队列 NSQ 官方客户端 go-nsq 怎么使用?

简介: Golang 语言编写的消息队列 NSQ 官方客户端 go-nsq 怎么使用?

介绍

NSQ 是 Golang 语言编写的实时分布式消息传递平台(也可以理解为消息队列),它主要由三个守护进程组成,分别是 nsqdnsqlookupdnsqadmin。其中 nsqd 是核心组成部分,它负责处理客户端的请求,比如生产、排序和消费消息等;nsqlookupd 负责管理集群拓扑信息和提供一个最终一致性的发现服务,nsqadmin 是一个 web 界面的管理平台,可以用于实时查看集群信息和执行其他管理操作。单个 nsqd可以含有很多 topic,每个 topic 可以含有很多 channel。

NSQ 支持跨平台和多语言客户端。使用 Mac 的读者朋友们可以使用 brew 方便的安装 NSQ。本文我们主要介绍 NSQ 官方提供的 golang 客户端 go-nsq。关于 NSQ 的更多内容,感兴趣的读者朋友们可以查阅官方文档,限于篇幅,本文不再赘述。

使用 go-nsq 操作 NSQ,需要安装 go-nsq 库,它提供了许多用于操作 NSQ 的函数和方法。

安装方式:

// Mac 安装 nsq
brew install nsq
// 安装 go-nsq
go get -u github.com/nsqio/go-nsq

生产者

go-nsq 包中的 Producer 类型,用于向 NSQ 发送消息。首先,需要调用函数 NewProducer 创建一个 Producer 实例,接收参数是 string 类型的 addr 和指针类型的 nsq.Config(NSQ 配置信息),返回结果是一个 Producer 实例的地址和 error。

需要注意的是,必须调用函数 NewConfig 返回一个指针类型的 nsq.Config,它包含默认配置信息。可以通过调用该实例的 Set 方法设置配置信息,并且必须在用于传参之前设置,否则设置的配置信息将不会生效。

Producer 包含很多方法,本文主要介绍四个方法,分别是 Ping、String、Publish 和 Stop。其中 Ping 方法用于检测 Producer 是否连接成功它配置的 nsqd;String 方法返回 Producer 连接的 nsqd 的地址;Publish 方法用于同步发送消息到指定的 topic;Stop 方法用于优雅地停止 Producer。

示例代码:

// 默认配置信息
 config := nsq.NewConfig()
 // 创建生产者
 producer, err := nsq.NewProducer("127.0.0.1:4150", config)
 if err != nil {
  log.Fatal(err)
 }
 // 验证生成者连接是否成功
 err = producer.Ping()
 if err != nil {
  log.Fatal(err)
 }
 // 返回生产者地址
 producerAddr := producer.String()
 log.Printf("producerAddr:%v", producerAddr)
 messageBody := []byte("hello")
 topicName := "topic"
 // 同步发送消息到指定 topic
 err = producer.Publish(topicName, messageBody)
 if err != nil {
  log.Fatal(err)
 }
 producer.Stop()

运行结果:

2021/10/23 18:58:23 INF    1 (127.0.0.1:4150) connecting to nsqd
2021/10/23 18:58:23 producerAddr:127.0.0.1:4150
2021/10/23 18:58:23 INF    1 stopping
2021/10/23 18:58:23 INF    1 exiting router

03

消费者

go-nsq 包中的 Consumer 类型,用于从 NSQ 消费消息。首先,需要调用函数 NewConsumer 创建一个 Consumer 实例,接收参数是 string 类型的 topic 和 channel,指针类型的 nsq.Config(NSQ 配置信息),返回结果是一个 Consumer 实例的地址和 error。

需要注意的是,必须调用函数 NewConfig 返回一个指针类型的 nsq.Config,它包含默认配置信息。可以通过调用该实例的 Set 方法设置配置信息,并且必须在用于传参之前设置,否则设置的配置信息将不会生效。

Consumer 包含很多方法,本文主要介绍三个方法,分别是 Stats、AddHandler 和 ConnectToNSQD。其中 Stats 方法用于检索 Consumer 的当前连接和消息统计信息;AddHandler 用于为 Consumer 消费的消息设置处理函数,每个处理函数都独立运行在一个 goroutine 中,如果需要启动多个 goroutine 运行处理函数,可以多次调用 AddHandler;ConnectToNSQD 用于连接配置的 nsqd

示例代码:

config := nsq.NewConfig()
 // 创建 Consumer
 consumer, err := nsq.NewConsumer("topic", "channel", config)
 if err != nil {
  log.Fatal(err)
 }
 consumerStats := consumer.Stats()
 log.Printf("consumerStats:%+v", consumerStats)
 // 给 Consumer 添加处理器,可添加多个,每个 Handler 都运行在单独的 goroutine 中
 consumer.AddHandler(&myMessageHandler{})
 // 连接 nsqd
 err = consumer.ConnectToNSQD("127.0.0.1:4150")
 if err != nil {
  log.Fatal(err)
 }
 <-consumer.StopChan

运行结果:

2021/10/23 18:59:30 consumerStats:&{MessagesReceived:0 MessagesFinished:0 MessagesRequeued:0 Connections:0}
2021/10/23 18:59:30 INF    1 [topic/channel] (127.0.0.1:4150) connecting to nsqd
2021/10/23 18:59:30 hello

04

总结

本文主要介绍 Golang 语言编写的实时分布式消息平台 NSQ 的 golang 客户端 go-nsq。它是 NSQ 官方提供的 NSQ Golang 客户端。并且分别介绍了 Producer 和 Consumer 的简单使用方法,大家可以根据自己的业务需求,使用 go-nsq 灵活运用 NSQ。关于 go-nsq 的更多内容,感兴趣的读者朋友们可以阅读官方文档。

推荐阅读:

Golang 语言怎么编写测试代码?

参考资料:

https://nsq.io/overview/design.html 

https://pkg.go.dev/github.com/nsqio/go-nsq@v1.0.8 


目录
相关文章
|
4月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
247 61
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
2月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
3月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
3月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
249 0
|
4月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
4月前
|
运维 网络协议 Go
Go网络编程:基于TCP的网络服务端与客户端
本文介绍了使用 Go 语言的 `net` 包开发 TCP 网络服务的基础与进阶内容。首先简述了 TCP 协议的基本概念和通信流程,接着详细讲解了服务端与客户端的开发步骤,并提供了简单回显服务的示例代码。同时,文章探讨了服务端并发处理连接的方法,以及粘包/拆包、异常检测、超时控制等进阶技巧。最后通过群聊服务端的实战案例巩固知识点,并总结了 TCP 在高可靠性场景中的优势及 Go 并发模型带来的便利性。
|
5月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
118 10

热门文章

最新文章

推荐镜像

更多