nsq go客户端跟不上

Posted

技术标签:

【中文标题】nsq go客户端跟不上【英文标题】:nsq go client can't keep up 【发布时间】:2015-05-28 09:25:21 【问题描述】:

我是来自 Node 世界的 Go 新手,我正在使用官方 Bitly Go 客户端构建消费者。我正在使用 AddConcurrentHandlers 生成 50 个 goroutine 来处理消息的消防软管。问题是我的消费者落后于在 nsq 上留下指数级的未处理/接收到的消息。有没有其他人遇到过这种情况?

我在 Node 中构建了相同的东西,以查看是否存在服务器或 NSQ 配置问题,以及它是否能够尽快处理所有消息。

去代码:

q, _ := nsq.NewConsumer("chat", "golangbetches", config)

q.AddConcurrentHandlers(nsq.HandlerFunc(func(message *nsq.Message) error 
  l.Debug("Got a message: %v", message)
  message.Finish()
  return nil
), 50)

err := q.ConnectToNSQLookupd("<address here>")

【问题讨论】:

GOMAXPROCS 你用什么? 你的意思是我给的 int 作为 AddConcurrentHandlers 中的第二个参数?它是 api 要求的,可能是为了防止无限数量的例程 不,JimB 询问了您的环境变量 GOMAXPROCS。未设置或太低不会使用所有内核。尝试将其设置为 2、4、8 和 12 并观察您的应用程序。 @cworsley4: GOMAXPROCS 设置在您的应用程序中运行 goroutines 的最大活动线程数。 好吧,将n 设置为某个随机的高数字并不是大多数n 的最佳解决方案。有关 GOMAXPROCS 的更多信息,请参见 golang.org/pkg/runtime 和 golang.org/pkg/runtime/#GOMAXPROCS 的摘要。看起来您正在使用 go-nsq 包;在这种情况下,您可能没有按照examples I just looked at 正确使用它 【参考方案1】:

cfg.MaxInFlight 处理“此消费者实例在飞行中允许的最大消息数...”更多详细信息,请参阅consumer source

cfg.MaxInFlight 设置为合理的值,因为它是defaults to 1

一个示例配置是available in the documentation,它被设置为1000。这可能适合也可能不适合您的应用;并且,您最好对其进行监控,因为错误配置可能会导致 truncated messages。

【讨论】:

再次感谢您!很好的答案! 绝对应该有更清晰的文档。 做一个 PR,我相信他们会接受对文档的一些改进! 有趣点;我在 Node 中创建了相同的服务器,但没有指定 MaxInFlight 选项,它能够跟上。而我使用的Node模块(nsq.js)默认为1。奇怪 好吧,有趣的是,nsq 的 js 模块中的reader.js 有一个默认的10,它覆盖了1connection.js。更多信息@github.com/segmentio/nsq.js/blob/… 和 github.com/segmentio/nsq.js/blob/…【参考方案2】:

另一种加速 go nsq 消费者的方法可以在这里找到:https://github.com/nsqio/go-nsq/issues/187

其中一个对我有用的是在 nsqd 上增加 --max-rdy-count,这允许增加消费者的 --max_in_flight 甚至高于默认的 2500。

【讨论】:

以上是关于nsq go客户端跟不上的主要内容,如果未能解决你的问题,请参考以下文章

golang使用Nsq

高性能消息队列之nsq

Go语言使用NSQ消息队列

带你入门Go语言的消息队列NSQ

nsq 消息传输的可靠性和持久化[一]

12.1 Go nsq