携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
NSQ是基于Golang开发的实时分布式消息队列,在Golang开发的消息队列中位列前茅,具有水平可拓展、低延迟、高可用性、易配置性等特点,在安装方面提供了二进制、docker两种较为通用的安装方法,在调用方面为Golang、Python、JavaScript提供了官方的SDK包,针对未封装SDK包的语言提供了通用的解析协议以及调用的API,本文将从以下几点出发分析如何安装、使用NSQ。
-
基于Docker环境安装NSQ
-
基于命令行操作NSQ中的数据
-
Golang 客户端安装
-
基于Golang 客户端操作NSQ中的数据
官方文档:nsq.io/overview/qu…
基于Docker环境安装NSQ
使用Docker只需一条命令即可安装并启动nsq,如果需要web端的UI界面可以使用nsqadmin进行启动
- 拉取 nsq 镜像
docker pull nsqio/nsq
- 启动 nsqlookupd
docker run -d --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd
- 启动 nsqd,需要指定 nsqlookupd 的地址;根据自己 nsqlookupd 的地址修改 broadcast-address、lookupd-tcp-address
docker run -d --name nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq /nsqd --broadcast-address=172.17.0.2 --lookupd-tcp-address=172.17.0.2:4160
启动后,使用一下命令检测是否启动成功curl http://127.0.0.1:4151/ping
,如果返回OK说明环境搭建成功了
命令行使用
NSQ提供了HTTP的API,我们可以使用这些API进行Topic、Channel的维护,系统运行状态的检测
# 创建 topic
curl -X POST http://127.0.0.1:4151/topic/create?topic=topic_name
# 创建 channel
curl -X POST http://127.0.0.1:4151/channel/create?topic=topic_name\&channel=channel_name
# 发送消息
curl -d "hello world" http://127.0.0.1:4151/pub?topic=topic_name
golang 模块安装
使用一下命令安装nsq的golang客户端
go get github.com/nsqio/go-nsq
基于golang 模块的基础使用
基于官方提供的Golang SDK可以快速接入NSQ消息队列
生产者
用于生成消息,并推送到指定的topic中
func TestProduct(t *testing.T) {
config := nsq.NewConfig()
// 获取生产者struct
producer, err := nsq.NewProducer("127.0.0.1:4150", config)
if err != nil {
log.Fatal(err)
}
// 向topic_name这个topic中发送hello world
err = producer.Publish("topic_name", []byte("hello world"))
if err != nil {
log.Fatal(err)
}
// 优雅停止生产者
producer.Stop()
}
消费者
用于监听生产者生成的消息,并接入业务逻辑进行后续处理
type consumerHandler struct {}
// HandleMessage 接受消息并处理业务逻辑
func (c *consumerHandler) HandleMessage(m *nsq.Message) error {
if len(m.Body) == 0 {
return nil
}
// 打印接受到的消息
log.Println(string(m.Body))
return nil
}
// 消费者
func TestConsumer(t *testing.T) {
config := nsq.NewConfig()
// 使用topic为topic_name, channel为channel_name创建消费者struc
consumer, err := nsq.NewConsumer("topic_name", "channel_name", config)
if err != nil {
log.Fatal(err)
}
// 将业务接入到消息中
consumer.AddHandler(&consumerHandler{})
err = consumer.ConnectToNSQLookupd("127.0.0.1:4161")
if err != nil {
log.Fatal(err)
}
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan
// 优雅停止消费者
consumer.Stop()
}