golang实时消息平台NSQ的使用

文章分享changjixiong 发表了文章 • 6 个评论 • 311 次浏览 • 2017-02-13 19:55 • 来自相关话题

NSQ是什么

(本文作者 changjixiong,以下是正文)

NSQ是一个实时消息平台,引用一段InfoQ上的介绍:

“NSQ是一... 			查看全部
					

NSQ是什么


(本文作者 changjixiong,以下是正文)


NSQ是一个实时消息平台,引用一段InfoQ上的介绍:


“NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub。NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。”

如何开始使用


这里有一个例子用来说明如何安装、启动以及发送与接收消息:
An Example of Using NSQ From Go(地址:http://tleyden.github.io/blog/2014/11/12/an-example-of-using-nsq-from-go/)


构建消息的响应函数


如果单是用一个匿名函数来处理收到的消息显然是不够的,下面用代码来演示一下如果根据收到的消息来使用相应的处理函数。


生产者


首先我们来创建生产者


config := nsq.NewConfig()
w, _ := nsq.NewProducer("127.0.0.1:4150", config)

jsonData := []string{}
jsonData = append(jsonData, `
{
"func_name":"BarFuncAdd",
"params":[0.5,0.51]
}`)
jsonData = append(jsonData, `
{
"func_name":"FooFuncSwap",
"params":["a","b"]
}`)

for _, j := range jsonData {
w.Publish("Topic_json", []byte(j))
}

上面的代码向NSQ发送了2个json格式的消息,从字面上不难看出其目的是调用2个函数,分别是BarFuncAdd和FooFuncSwap。


消费者


现在我们来创建消费者


config := nsq.NewConfig()
config.DefaultRequeueDelay = 0
config.MaxBackoffDuration = 20 * time.Millisecond
config.LookupdPollInterval = 1000 * time.Millisecond
config.RDYRedistributeInterval = 1000 * time.Millisecond
config.MaxInFlight = 2500

MakeConsumer("Topic_json", "ch", config, HandleJsonMessage)

MakeConsumer的定义如下:


func MakeConsumer(topic, channel string, config *nsq.Config,
handle func(message *nsq.Message) error) {
consumer, _ := nsq.NewConsumer(topic, channel, config)
consumer.AddHandler(nsq.HandlerFunc(handle))
err := consumer.ConnectToNSQD("127.0.0.1:4150")
if err != nil {
log.Panic("Could not connect")
}
}

处理器函数


NSQ消息的处理器函数定义如下:


func HandleJsonMessage(message *nsq.Message) error {

resultJson := reflectinvoke.InvokeByJson([]byte(message.Body))
result := reflectinvoke.Response{}
err := json.Unmarshal(resultJson, &result)
if err != nil {
return err
}
info := "HandleJsonMessage get a result\n"
info += "raw:\n" + string(resultJson) + "\n"
info += "function: " + result.FuncName + " \n"
info += fmt.Sprintf("result: %v\n", result.Data)
info += fmt.Sprintf("error: %d,%s\n\n", result.ErrorCode,
reflectinvoke.ErrorMsg(result.ErrorCode))

fmt.Println(info)

return nil
}

功能函数


处理器函数根据收到的json数据通过反射最终调用了Foo的FooFuncSwap方法及Bar的BarFuncAdd方法。


type Foo struct {
}

type Bar struct {
}

func (b *Bar) BarFuncAdd(argOne, argTwo float64) float64 {

return argOne + argTwo
}

func (f *Foo) FooFuncSwap(argOne, argTwo string) (string, string) {

return argTwo, argOne
}

怎么调用的


reflectinvoke.InvokeByJson是如何根据形如:


{
"func_name":"BarFuncAdd",
"params":[0.5,0.51]
}

的 json数据调用Bar.BarFuncAdd的?
请参考《golang通过反射使用json字符串调用struct的指定方法及返回json结果》(如果前面这段没有连接地址,那肯定是文章被爬虫干掉了连接,请找本文的原文阅读)


文中代码的完整内容在https://github.com/changjixiong/goNotes/tree/master/nsqNotes以及https://github.com/changjixiong/goNotes/tree/master/reflectinvoke中。


注意事项


同一个消息channel如果有多个消费者则消费者收到的消息是不确定的。例如,如果将文中的生产者运行一个实例,将消费者运行两个实例(命名为A,B),则会出现A收到2个消息或者B收到2个消息或者AB各收到一个消息。

beego orm模型定义中整形的长度问题

有问必答astaxie 回复了问题 • 2 人关注 • 2 个回复 • 234 次浏览 • 2017-02-13 14:33 • 来自相关话题

撸了一个Golang的包管理/自动化构建工具,欢迎大家拍砖

开源程序blindpirate 发表了文章 • 3 个评论 • 210 次浏览 • 2017-02-12 21:45 • 来自相关话题

最近撸了一个Gradle插件,用来对Golang进行包管理和自动化构建。项目在这里。Feature有:

最近撸了一个Gradle插件,用来对Golang进行包管理和自动化构建。项目在这里。Feature有:



  • JDK 8+外无需预先安装任何东西(包括Go本身)

  • 支持所有版本的Go且允许多版本共存

  • 完美支持几乎所有平台(只要能够运行Java,本项目的所有测试在OS X 10.11/Ubuntu 12.04/Windows 7上通过)

  • 项目级的依赖隔离,无需设置GOPATH

  • 完善的包管理

    • 无需手工安装依赖包,只需指定版本

    • 无需安装即可支持Go语言默认支持的四种版本控制工具:Git/Svn/Mercurial/Bazzar (当前只实现了Git)

    • 支持传递性依赖

    • 支持自定义传递性依赖策略

    • 自动解决冲突

    • 支持依赖锁定

    • 支持glide/glock/godep/gom/gopm/govendor/gvt/gbvendor/trash等外部依赖的导入(基于这份报告

    • 支持语义化版本

    • 支持vendor

    • 支持依赖的扁平化 (受glide启发)

    • 支持本地包重命名

    • 支持私有仓库

    • 构建、测试依赖分别管理

    • 支持依赖树可视化


  • 支持构建、测试、单个/通配符测试、交叉编译

  • 现代的、生产级别的自动化构建支持,添加自定义任务极其简单

  • 原生的Gradle语法

  • 额外为中国大陆开发者提供的特性,你懂的

  • Shadowsocks支持

  • 增量构建(开发中)

  • IDE插件支持(规划中)


欢迎大家拍砖!

第三届GopherChina大会正式启动了

文章分享junnplus 回复了问题 • 12 人关注 • 10 个回复 • 892 次浏览 • 2017-02-12 10:54 • 来自相关话题

dockerSSH用ssh连接到docker

开源程序myml 发表了文章 • 3 个评论 • 98 次浏览 • 2017-02-11 21:59 • 来自相关话题

dockerSSH

用golang.org/x/crypto/ssh 实现的ssh服务器,能直接让你通过ss... 查看全部

dockerSSH


用golang.org/x/crypto/ssh 实现的ssh服务器,能直接让你通过ssh登陆到docker容器内,比如ssh ff756b3ea527@127.0.0.1 会登陆到ID为ff756b3ea527的容器,刚实现的尚不成熟,还有一些功能想去实现,比如scp,sftp

Golang工程师 上海浦东

招聘应聘stirlingx 回复了问题 • 2 人关注 • 2 个回复 • 333 次浏览 • 2017-02-10 13:59 • 来自相关话题

beego orm 默认limit值

有问必答astaxie 回复了问题 • 3 人关注 • 2 个回复 • 149 次浏览 • 2017-02-10 13:57 • 来自相关话题

疑似刷论坛做硬推广

文章分享lgn21st 回复了问题 • 3 人关注 • 3 个回复 • 216 次浏览 • 2017-02-10 13:55 • 来自相关话题

收到广告私信?

有问必答astaxie 回复了问题 • 3 人关注 • 2 个回复 • 137 次浏览 • 2017-02-10 13:53 • 来自相关话题

go怎么获取本机ip的疑问

有问必答Akagi201 回复了问题 • 6 人关注 • 4 个回复 • 350 次浏览 • 2017-02-09 18:43 • 来自相关话题

【北京-美餐】招聘 『Web 开发工程师(Go 语言)』15-30 K

回复

招聘应聘meican 发起了问题 • 0 人关注 • 0 个回复 • 331 次浏览 • 2017-02-08 15:19 • 来自相关话题

在docker swarm中使用grpc如何做负载均衡

有问必答jmzwcn 回复了问题 • 1 人关注 • 1 个回复 • 180 次浏览 • 2017-02-07 19:40 • 来自相关话题

电竞行业 招聘Golang工程师 Dota2相关

招聘应聘dido 发表了文章 • 3 个评论 • 354 次浏览 • 2017-02-07 14:46 • 来自相关话题

Golang开发工程师 10-30K 上海浦东

析乐数据 简历请投至 yangx@ceelo.cn

工作职责:

1、使用golang... 查看全部

Golang开发工程师 10-30K 上海浦东


析乐数据 简历请投至 yangx@ceelo.cn


工作职责:


1、使用golang语言编写游戏录像解析器(二次开发)


2、Beego web服务器开发与维护


职位要求:


1、对dota2、LOL等moba类游戏有较为深入的了解


2、熟悉Go语言,对Golang系统库有研究者优先


3、有 Linux 的使用经验,具备一定的脚本和系统维护能力


4、具备C++、Node.js开发经验者优先


5、主动积极,善于学习和总结,乐于分享,有较强的团队精神。


6、对新领域有好奇心,勇于尝试


公司福利:


1、我们颠覆以往你对创业公司的印象,10点上班18点下班,双休,法定假日只多不少。


2、基本无加班,加班双薪,亦可调休。


3、法定假日(除清明节外)均有丰厚的过节费。


4、公司标配i7、GTX1080,Cherry Board 6.0


5、零食饮料不限量供应(你唯一的顾虑就是你的体重)


6、一年一次国内游,两年一次国外游,欢迎踊跃携带家属(没错,家属费用公司全包)


7、结婚蜜月花费公司报销一半(仅限头婚,二婚请自重哦)


HR直招,猎头勿扰~

好玩的github项目-用go做个flappy bird

Go开源项目wwdyy 发表了文章 • 1 个评论 • 296 次浏览 • 2017-02-06 22:46 • 来自相关话题

flappy gopher

转自github用户neomede

A flappy bird clone made in go. 查看全部

flappy gopher


转自github用户neomede


A flappy bird clone made in go.


Based on this video and this project by Francesc Campoy, also this project by Sab


Play


Just run "make run" and use any button to jump


github地址:https://github.com/neomede/flappy

如何理解Go语言中的动态内存分配和静态内存分配?

有问必答Ky 回复了问题 • 7 人关注 • 7 个回复 • 628 次浏览 • 2017-02-06 21:39 • 来自相关话题