日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
.NETCore中的RabbitMQ消費者CPU高,竟然是這個原因

在 RabbitMQ 中有一個 vhsot 機制,可以用來做租戶隔離,當產品從單租戶演化為多租戶時,正好可以用到這個特性,不同 vhost 中的交換機、隊列互不影響。

專注于為中小企業(yè)提供成都網站建設、網站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)弋江免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現(xiàn)規(guī)模擴充和轉變。

起初在產品中引入 RabbitMQ 的時候,版本如下:

  • RabbitMQ:3.7.2 (后來升級為 3.8.2)。
  • RabbitMQ Client:5.1.2。
  • .NET Core:3.1。

通過一段時間的努力,產品終于支持多租戶模式了,測試在做測試的時候發(fā)現(xiàn)了一個問題,隨著租戶數(shù)添加的越來越多,RabbitMQ 消費者的 CPU 占用也越來越高。

100 左右的租戶數(shù),每個租戶隊列大概 10 幾個,這時 CPU 占用穩(wěn)定在 50% 左右,即使系統(tǒng)沒有任何人訪問。

分析下可能的原因:

  • 因產品比較復雜,可能是其代碼影響到。
  • 可能是 RabbitMQ 的參數(shù)問題。
  • 可能是 .NET Core 中的驅動的問題,可以嘗試下 Java 。

正式進入問題的排查。

簡單示例

1、在 .NET Core 3.1 中編寫一個簡單的 RabbitMQ 示例:

public void Start()
{
Console.WriteLine("App Start...");
_defMqConfig = new MQConfig()
{
MQAutomaticRecoveryEnabled = true,
MQHeartBeat = 5,
MQNetworkRecoveryInterval = 5,
MQVHost = "/",
MQHostName = _mqHostName,
MQUserName = _mqUserName,
MQPassword = _mqPassword,
MQPort = _mqPort,
MQServerPort = string.IsNullOrEmpty(_mqServerPort) ? $"1{_mqPort}" : _mqServerPort
};
Console.WriteLine(" MQ vhost init Start...");
string prefix = "testhost";
for (int i = 0; i < 200; i++)
{
string vhost = $"{prefix}{i}";
InitAllVhost(vhost);
Console.WriteLine($" 初始化vhost:{vhost}...");
}
Console.WriteLine(" MQ vhost init Done...");
Console.WriteLine("App Start Done...");
}
private void InitAllVhost(string vhost)
{
string url = $"http://{_mqHostName}:{_mqServerPort}";
_mqManager.AddVirtualHost(url, vhost, _mqUserName, _mqPassword);

_defMqConfig.MQVHost = vhost;
_mqManager.Subscribe(_defMqConfig);
}

2、監(jiān)聽的代碼如下:

public void Subscribe(MQConfig engineConfig)
{
var factory = new ConnectionFactory();
factory.HostName = engineConfig.MQHostName;
factory.UserName = engineConfig.MQUserName;
factory.Password = engineConfig.MQPassword;
factory.VirtualHost = engineConfig.MQVHost;
factory.RequestedHeartbeat = (ushort) engineConfig.MQHeartBeat;
factory.AutomaticRecoveryEnabled = true;
factory.NetworkRecoveryInterval = new TimeSpan(engineConfig.MQNetworkRecoveryInterval);
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
channel.QueueDeclare("TestQueue", false, false, false, null);
channel.ExchangeDeclare("TestQueueExchange", ExchangeType.Direct, false, false, null);
var consumer = new EventingBasicConsumer(channel);
channel.BasicConsume("TestQueue", false, consumer);
channel.QueueBind("TestQueue", "TestQueueExchange", "TestQueueExchange");
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine("已接收: {0}", message);
};
}

3、上面代碼創(chuàng)建了 200 個 vhost ,每個 vhost 中 1 個隊列,程序運行后觀察 cpu 如下圖:

4、在 Subscribe 方法中有創(chuàng)建 Connection 和 CreateModel 方法,如果使用 using 或在方法最后對其進行釋放,CPU 會是一個正常的狀態(tài),但消息也就接收不到了。

調整參數(shù)

1、在 RabbitMQ 中有兩個參數(shù) MQHeartBeat、MQNetworkRecoveryInterval :

  • MQHeartBeat:心跳檢測
  • MQNetworkRecoveryInterval:掉線重連

2、不斷調整這兩個參數(shù)的值,進行嘗試,發(fā)現(xiàn) CPU 并沒有明顯改善。

嘗試 Java

當沒有什么頭緒的時候,就會采用各種方式進行嘗試,來排除問題,所以決定用 Java 試試。

在 Java 程序中,使用的 RabbitMQ 客戶端為 rabbitmq-java-client ,版本為 5.14.2 ,因為之前在 .NET 程序驗證時已經創(chuàng)建了 vhost ,所以在 Java 程序中只寫了消費者進行監(jiān)聽。

當 Java 程序跑起來的時候,發(fā)現(xiàn) CPU 占用是正常的,在遍歷 vhost 監(jiān)聽的過程中 CPU 有所波動,遍歷完后 ,CPU 占用比較穩(wěn)定。

真正的原因

這時基本可以確定,是 .NET Core 的 RabbitMQ 客戶端的問題,到這時才想起有可能是 .NET Core  RabbitMQ 客戶端的版本問題,檢查發(fā)現(xiàn)目前使用的版本是 5.1.2,而最新的版本為 6.3.0 。

升級 .NET Core RabbitMQ 到最新版本,升級后有兩個地方不兼容:

  • RequestedHeartbeat 類型變成了 TimeSpan。
  • 接收的消息由 byte[] 變成了 ReadOnlyMemory類型。

修改這兩處后,趕緊運行進行測試,CPU 終于正常了。

查看了下 RabbitMQ 客戶端在 GitHub 上的更新記錄,發(fā)現(xiàn)在版本 6.2.4 中有修復一個關于連接的 Bug:

又繼續(xù)將版本回退到 6.2.3 進行測試,問題又能重現(xiàn)了,就更加確定了這個問題是在 6.2.4 中解決了。

最后

現(xiàn)在無論是做項目還是做產品,都會使用很多中間件,這些中間件和相關的庫也是在不斷地更新迭代的,當我們進行功能迭代的同時,也需要關注這些中間件的發(fā)展,在新的版本中提供了什么新特性,修復了什么問題,這給我們是否升級提供依據(jù)。


分享名稱:.NETCore中的RabbitMQ消費者CPU高,竟然是這個原因
標題來源:http://m.5511xx.com/article/dphopeh.html