go - nsqjs 客户端,不立即从 go-nsq 服务器端接收消息

标签 go nsq go-nsq

尝试学习 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 客户端接收刚刚发布的消息很慢:

  1. 如果主题是新主题并且主题发现是通过nsqlookupd,那么默认情况下,nsqjs 阅读器将尝试每 30 秒发现新主题。

    从上面的示例来看,您似乎正在为每次导入创建新主题。我相信,如果您首先从 Golang 客户端开始发布消息,然后再启动 nsqjs 客户端,那么您应该不会看到延迟。

  2. 如果你有多个 nsqds 并且 max-in-flight 设置得太低,那么它会将 nsqjs Reader 置于饥饿模式,它会移动RDY 在设定的时间段内在 nsqds 之间计数。

    我不确定这是怎么回事,因为我无法说明任何关于 nsq 拓扑的信息。只要您的 max-in-flight 设置高于您拥有的 nsqd 实例数,那么您的状态就会很好。

关于go - nsqjs 客户端,不立即从 go-nsq 服务器端接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704986/

相关文章:

go - 在 Golang 中使用 goroutine 时遇到问题

json - 我如何解码 JSON?

go - 眼镜蛇go cli库忽略标志

google-app-engine - 在 beegae 中使用 CSS

docker - nsq 无法通过连接到 nsqlookupd 来消费消息

mysql - 如何将数据库与微服务(以及新服务)同步?

logging - 在 log.SetOutput(ioutil.Discard) 之后延迟 log.SetOutput(os.Stdout)