尝试学习 nsq,并按照 here golang example 中的示例进行操作和 here nsqjs .我正在服务器端发送消息,执行 w/for 循环和 go 例程
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func(x int) {
defer wg.Done()
chanName := fmt.Sprintf("import_progress_587e6442ff74889098498f6e")
m := map[string]interface{}{
"body": map[string]interface{}{
"progress": x,
},
}
msg, _ := json.Marshal(m)
req := NSQPubReq{
Topic: chanName,
Body: msg,
}
if err := producer.Publish(req.Topic, req.Body); err != nil {
}
utils.Info(fmt.Sprintf("sent msg=%v", string(msg)))
}(i)
}
wg.Wait()
但问题是,在客户端。
// channel = 'import_progress_587e6442ff74889098498f6e'
let reader = new nsq.Reader(channel, channel, {
//lookupdHTTPAddresses: '<<IP>>:4161',
maxInFlight: 10000,
snappy: true
})
reader.connect()
reader.on('message', (msg) => {
var msgData = {
id: msg.id,
body: msg.body.toString(),
chan: channel
}
io.emit(channel, msgData)
msg.finish()
})
消息不会立即出现在客户端。我将等待几秒钟,直到消息到达 nodejs 客户端。有什么我需要做的设置吗?谢谢!
最佳答案
有几个原因导致 nsqjs 客户端接收刚刚发布的消息很慢:
如果主题是新主题并且主题发现是通过
nsqlookupd
,那么默认情况下,nsqjs 阅读器将尝试每 30 秒发现新主题。从上面的示例来看,您似乎正在为每次导入创建新主题。我相信,如果您首先从 Golang 客户端开始发布消息,然后再启动 nsqjs 客户端,那么您应该不会看到延迟。
如果你有多个 nsqds 并且
max-in-flight
设置得太低,那么它会将 nsqjsReader
置于饥饿模式,它会移动RDY
在设定的时间段内在 nsqds 之间计数。我不确定这是怎么回事,因为我无法说明任何关于 nsq 拓扑的信息。只要您的 max-in-flight 设置高于您拥有的
nsqd
实例数,那么您的状态就会很好。
关于go - nsqjs 客户端,不立即从 go-nsq 服务器端接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704986/