NSQ的golang客户端简单使用

原创 2016年08月29日 11:19:52

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和数据就行了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

nsq 快速入门经验分享

nsq 是什么东西,这里就不长篇大论啦我在 Mac 上尝试 nsq.io 中提供的 QUICK START 遇到问题,这里作简要说明...

golang实战-nsq集群入门与坑

前端时间群里的gofans大增,问到了nsq在集群使用的使用问题。这里简单整理了一下,希望有所帮助。作为实时的分布式消息处理平台,nsq设计的目的是用来大规模地处理每天数以十亿计级别的消息。 由于具...

golang实时消息平台NSQ的使用

NSQ是什么 (本文作者 changjixiong,以下是正文) NSQ是一个实时消息平台,引用一段InfoQ上的介绍: “NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布...

初识NSQ分布式实时消息架构

初识NSQ1.NSQ知识普及NSQ是一个基于Go语言的开源的分布式实时消息平台,他的代码托管在GitHub上。NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心...

nsq源码阅读笔记之nsqd(四)——Channel

Topic/Channel是发布/订阅模型的一种实现。Topic对应于发布,Channel对应于订阅。 消费者通过在Topic下生成不同的Channel来接收来自该Topic的消息。 通过生成相同的C...

浅析NSQ客户端consume过程源码

NSQ是一个用go语言实现的分布式消息系统,本篇博客不介绍NSQ的整体架构,这方面可以自己去了解。因为曾经的工作运用到了NSQ,我这两天闲下来研究了一下NSQ的客户端是如何完成consume这整个过程...

java调用NSQ消息服务

java调用NSQ消息服务 nsq 提供了丰富的客户端调用库,根据官网提供 我这里使用的是JavaNSQClient,可以从 https://github.com/brainlag/J...
  • FS_sky
  • FS_sky
  • 2017年03月23日 12:07
  • 1267

golang使用net/http实现一对客户端和服务器连接的例子

golang的net/http封装很强大,可惜网上的教程或者源码很少。这里简单实现了一对服务器和客户端的连接。 客户端代码如下: package main import ( "fmt" "io/i...
  • su_sai
  • su_sai
  • 2016年04月18日 00:58
  • 1790

NSQ研究与实践

学习与实践 环境部署 原理与收发机制 NSQ NSQD NSQDLOOKUPD 介绍 Features 组件 拓扑结构 原理 nsqadmin 实践 研究 消息中间件,常用的MQ如RabbitMQ,A...

java操作nsq数据插入elasticsearch

在网上找了很多资料关于怎么从nsq中通过java拉取数据存到es中去,因为之前没有接触过nsq和elasticsearch。所以没有一套完整的流程案例,也折腾了好几天。写下来给大家借鉴,也给自己做个记...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NSQ的golang客户端简单使用
举报原因:
原因补充:

(最多只允许输入30个字)