1

我在ASP.NET Core應用程序中有一個HTTP端點,它將幾條消息發送到Azure服務總線。QueueClient.CreateFromConnectionString緩存內部連接嗎?

眼下,控制器動作代碼做到這一點:

var client = QueueClient.CreateFromConnectionString(this.connectionString, entityPath); 
await client.SendAsync(message); 

所創建不支持Dispose所以我不知道它的壽命應該有多長的QueueClient?我爲每個HTTP請求創建一個新的。 QueueClient的CreateFromConnectionString方法是否緩存到服務總線的內部連接?這裏最佳的解決方案是什麼?我問,因爲在交通高峯期間我最近從服務車上收到TimeoutExceptions

回答

1

如約服務總線的客戶端中提到此官方document

服務總線客戶對象,如QueueClient或messageSender,和,通過一個MessagingFactory對象,這也提供連接的內部管理創建。 發送郵件後,您不應關閉郵件工廠或隊列,主題和訂閱客戶端,然後在發送下一條消息時重新創建它們。 關閉消息傳遞工廠將刪除與服務總線服務的連接,並在重新創建工廠時建立新連接。建立連接是一個昂貴的操作,您可以通過爲多個操作重複使用相同的工廠和客戶端對象來避免這種操作。 您可以安全地使用QueueClient對象從併發異步操作和多線程發送消息。

我這麼問是因爲我已經從服務總線中的流量峯值已接收TimeoutExceptions最近。

正如官方document提到有關服務總線的消息TimeoutException異常

一個TimeoutException表示用戶發起的操作時間比操作超時時間。您應該檢查ServicePointManager.DefaultConnectionLimit屬性的值,因爲達到此限制也會導致TimeoutException

我認爲您可以嘗試增加OperationTimeout並添加重試邏輯,如下所示來構建您的QueueClient並重用此QueueClient對象。

var builder = new ServiceBusConnectionStringBuilder("{ServicesBusConnectionString}") 
{ 
    OperationTimeout = TimeSpan.FromMinutes(5) 
}; 
var messagingFactory = MessagingFactory.CreateFromConnectionString(builder.ToString()); 
QueueClient queueClient = messagingFactory.CreateQueueClient("{queueName}"); 
queueClient.RetryPolicy = new RetryExponential(
       TimeSpan.Zero, 
       TimeSpan.FromMinutes(5), 
       2); 
queueClient.SendAsync("{BrokeredMessage}"); 
+1

我已經閱讀過,但我沒有直接使用MessagingFactory。相反,我使用靜態QueueClient.CreateFromConnectionString方法。這是否關閉MessagingFactory或者是否存在由靜態QueueClient類使用的單個靜態實例?這是文檔失敗的地方。也許我會使用你提供的代碼,如果沒有其他人可以清除它。 –

+0

我還會補充一點,我只是增加了DefaultConnectionLimit,儘管我讀過的所有內容都表明它只用於HTTP調用,而ASB使用專有的TCP協議。 –