【第22期】观点:IT 行业加班,到底有没有价值?

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源码阅读笔记之nsqd(四)——Channel

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

golang实时消息平台NSQ的使用

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

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

NSQ研究与实践

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

NSQ 安装指南

NSQ 安装指南假设我们的服务器安装下面要求编排。nsqlookup 集群列表192.168.234.77 192.168.234.36 192.168.234.39 nsq 节点192.168.23...

nsq 快速入门经验分享

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

C#控制台的输入和输出-Console类-输出到控制台

C# 控制台程序一般使用 .NET Framework Console 类提供的输入/输出服务。我们多次用到Console.WriteLine方法,我们再学习一些其他的方法。输出到控制台输出到控制台就...

C#-向控制台简单输出输入

在C#中,向Console输出的方法有多种。这里就详细介绍一种,就是在Console类中的Write/WriteLine()方法中应用格式化字符串。格式如下:               Consol...

C#控制台输出

原文地址:http://blog.163.com/fujl_2008/blog/static/1037810720088146134448/ C#控制台输出有两种方法:Write()...

Linux安装及部署NSQ消息队列

1、NSQ知识点说明 NSQ是一个基于Go语言的开源分布式实时消息平台,NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架构,...

nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化

nsqd的配置解析和初始化 配置解析nsqd的主函数位于apps/nsqd.go中的main函数flagSet := nsqFlagset() flagSet.Parse(os.Args[1:])首先...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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