Golang之NSQ基础使用

188 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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进行启动

  1. 拉取 nsq 镜像
docker pull nsqio/nsq
  1. 启动 nsqlookupd
docker run -d --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd
  1. 启动 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()
}