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
,它覆盖了1
的connection.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客户端跟不上的主要内容,如果未能解决你的问题,请参考以下文章