几年来,我们一直在生产中使用 NATS,只有一台服务器和大约 1,500 个使用 NATS.net 客户端的消费者,但最终开始详细分析性能,并且经常看到消费者在消费消息时出现很大延迟。
为了简单起见,我们有一个在消费者身上生成的乒乓式消息,通过 NATS 发送到中央服务器,该服务器对其进行处理并发送回回复。两条消息上都有时间戳,并标识它正在回复的消息。
我们看到的是消费者和中央服务器之间根本没有问题,它似乎一直在得到它们,但有时在消费者消费回复消息之前可能会有几分钟的延迟。
需要明确的是,对于流的每个方向,我们都有 2 个单独的 NATS 连接。
这是我们从订阅中消费的代码:
var thread = new Thread(() =>
{
using (_subscription = _queueGroup == null ? NATSConnection.Connection.SubscribeSync(_subject) : NATSConnection.Connection.SubscribeSync(_subject, _queueGroup))
{
Connection.RaiseSubscriberConnected();
while (_active)
{
try
{
var nextMessage = _subscription.NextMessage();
if (nextMessage != null)
{
Log.Debug("Subscriber Message Received");
using (var stream = new MemoryStream(nextMessage.Data))
{
NewSubscriptionItem.Invoke(Envelope.Parser.ParseFrom(stream));
}
}
}
catch (Exception ex)
{
Connection.RaiseException(ex);
}
}
}
})
{
IsBackground = true
};
thread.Start();
}
在我们缺少回复的期间,这Log.Debug("Subscriber Message Received");
条线根本没有被击中,然后在一段时间后,所有未完成的消息都会一次击中......就好像有一个“阻塞”被清除了。
消费者正在运行的机器确实有很多事情要做,但 CPU 从未突破 50% 左右。
任何有关下一步检查内容的指示将不胜感激!