专栏首页Golang语言社区NSQ的golang客户端简单使用

NSQ的golang客户端简单使用

NSQ 是由国外的一个短链服务商bitly使用golang开发的一个消息队列系统,正好使用到了这个东西,在这里简单的记录下。

获取客户端

nsq的golang客户端是官方版本的

go get github.com/nsqio/go-nsq

即可

简单的消费者和生产者使用

该客户端有原始的command函数用于一些基础操作,也有consumer和producer的封装,我这里是直接使用了封装了。

  • consumer

消费者比较简单,只要监听队列消息,并处理就可以了,下面是一个简单的例子。

type NSQHandler struct {
}

func (this *NSQHandler) HandleMessage(message *nsq.Message) error {
    log.Println("recv:", string(message.Body))
    return nil
}

func testNSQ() {
    waiter := sync.WaitGroup{}
    waiter.Add(1)

    go func() {
        defer waiter.Done()

        consumer, err := nsq.NewConsumer("test", "ch1", nsq.NewConfig())
        if nil != err {
            log.Println(err)
            return
        }

        consumer.AddHandler(&NSQHandler{})
        err = consumer.ConnectToNSQD("10.100.156.207:4150")
        if nil != err {
            log.Println(err)
            return
        }

        select {}
    }()

    waiter.Wait()
}

创建好consumer后,只需要自己创建一个struct并实现HandleMessage方法即可,当有消息时候,再去处理消息。

需要注意的是,AddHandler的回调是在别的routine中执行的,并且可以添加多个handler用于处理消息,这里可能需要注意下线程的同步问题。

  • producer

生产者也和消费者差不多,首先需要创建一个producer

func (this *MsgQueue) Init(addr string) error {
    var err error
    this.addr = addr

    //  try to connect
    cfg := nsq.NewConfig()
    this.producer, err = nsq.NewProducer(addr, cfg)
    if nil != err {
        return err
    }

    //  try to ping
    err = this.producer.Ping()
    if nil != err {
        this.producer.Stop()
        this.producer = nil
        return err
    }

    return nil
}

producer封装了较多的方法,分为同步和异步两种。带Async后缀的,都是异步的。

同步是收到了nsq的回应后再返回的函数,所以可能会堵塞,而异步的操作,则调用方需要传入一个chan用于接收结果,当有结果返回或者是超时的情况下,相应的内容会写到该chan中。

在这里我用了同步的api,毕竟消息队列假如出了什么问题,那么整个服务就不可用了,而且同步改异步也不会太麻烦,以后可以做下修改。

publish的方法也很简单,提供一个topic和数据就行了。

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-09-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go语言图片处理和生成缩略图的方法

    package main import ( "fmt" "os" "image" "image/color" "imag...

    李海彬
  • 【JS游戏编程基础】关于js里的this关键字的理解

    this关键字在c++,java中都提供了这个关键字,在刚开始学习时觉得有难度,但是只要理解了,用起来就方便多了,下面通过本篇文章给大家详解js里this关键字...

    李海彬
  • Oculus + Node.js + Three.js 打造VR世界

    Oculus Rift 是一款为电子游戏设计的头戴式显示器。这是一款虚拟现实设备。这款设备很可能改变未来人们游戏的方式。 周五Hackday Showcase的...

    李海彬
  • IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)

    本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获。如果您大学...

    JackJiang
  • IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)

    本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获。如果您大学...

    JackJiang
  • java解析xml技术(二)

    forrestlin
  • 大数据对信息安全:“惹祸”同时有巨额价值

      如果担心被发现,最好不要去做这件事。”谷歌公司高管这样回答关于防止隐私泄露的询问。   在《第一财经日报》记者参加的2014年中国计算机大会(CNCC...

    腾讯研究院
  • ceph暂停数据平衡 转

    domain0
  • 为什么不建议你入门计算机视觉

    作者:Jackpop https://zhihu.com/p/question/317440183 本文已授权,未经允许,不得二次转载

    小白学视觉
  • k8s如何加入TLS安全访问,技术发烧友为你探路

    作者简介 ? ? 以前外部访问k8s里的服务,都是直接以http方式进行的,缺少TLS安全,今天给大家详细分析一下怎么为k8s加TLS安全访问。 生成并信任自...

    腾讯云TStack

扫码关注云+社区

领取腾讯云代金券