最近发现线上使用nsq的服务平均延迟在200多毫秒,测试了发现延迟在nsq。
然后测试了,在同一个 topic 消息量不大的时候延迟很低,在1ms左右,当每秒消息超过5条的时候延迟就在200多毫秒了。其实nsq客户端的Consumer 有个配置项: OutputBufferTimeout,这个是设置在 flushing 到客户端前,最长的配置时间间隔。而默认是250ms, 配合OutputBufferTimeout的缓冲区,所以会有延迟。
解决:
1.把MaxInFlight设置成1,就不会启用缓冲区,但是这样就需要前一条消息ack后才处理下一条,所以不可取
2. 把OutputBufferTimeout设置到可以接受的数值就好了,但是注意这个值设置到小于25ms 对cpu占用比较明显。
设置示例:
cfg := nsq.NewConfig()
cfg.MaxInFlight = optMaxInFlight
cfg.OutputBufferTimeout = time.Millisecond * 50
consumer, err := nsq.NewConsumer(topic, channel, cfg)
if err != nil {
return err
}