【发布时间】: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 正确使用它