1

几年来,我们一直在生产中使用 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% 左右。

任何有关下一步检查内容的指示将不胜感激!

4

0 回答 0