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

时间:2017-01-17 19:03:43

标签: go nsq go-nsq

尝试学习nsq,并按照here golang examplehere nsqjs中的示例进行操作。我在服务器端发送消息,执行for循环并执行例程

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客户端。我需要做任何设置吗?谢谢!

1 个答案:

答案 0 :(得分:4)

有几个原因导致nsqjs客户端收到刚刚发布的消息的速度很慢:

  1. 如果主题是新主题并且主题的发现是通过nsqlookupd,则默认情况下,nsqjs Reader将尝试每30秒发现一个新主题。

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

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

    我不确定这是什么,因为我无法说出nsq拓扑。只要你的最大飞行时间设置高于你拥有的nsqd个实例的数量,那么你就会处于良好的状态。