我的应用程序使用Azure Service Bus来存储邮件。我有一个名为HttpTriggerEnqueue
的Azure函数,它允许我将消息排入队列。问题是这个函数可以在很短的时间间隔内调用数百次。当我拨打HttpTriggerEnqueue
一次,两次,10次或50次时,一切正常。但是,当我称它为200次,300次(这是我的用例)时,我收到一个错误,并不是所有的消息都被排队。从函数门户我得到以下错误。
threshold exceeded [connections]
我尝试了.NET sdk和HTTP请求。这是我的代码
HTTP REQUEST:
try
{
var ENQUEUE = "https://<MyNamespace>.servicebus.windows.net/<MyEntityPath>/messages";
var client = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip });
var request = new HttpRequestMessage(HttpMethod.Post, ENQUEUE);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var sasToken = SASTokenGenerator.GetSASToken(
"https://<MyNamespace>.servicebus.windows.net/<MyEntityPath>/",
"<MyKeyName>",
"<MyPrimaryKey>",
TimeSpan.FromDays(1)
);
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", sasToken);
request.Content = new StringContent(message, Encoding.UTF8, "application/json");
request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
var res = await client.SendAsync(request);
}
catch (Exception e) { }
使用SDK的代码:
var qClient = QueueClient.CreateFromConnectionString(MyConnectionString, MyQueueName);
var bMessage = new BrokeredMessage(message);
qClient.Send(bMessage);
qClient.Close();
我在Azure上有标准的层定价。 如果我在一段时间内调用函数300(例如)次,则会出现错误。我怎么解决?
答案 0 :(得分:2)
这里的实际问题不在于Service Bus绑定(尽管你应该遵循@Mikhail给出的建议),这是HttpClient
的一个众所周知的问题。您不应该在每个函数调用上重新创建HttpClient。将其存储在静态字段中,以便可以重复使用。 Read this blog post for a great breakdown on the actual issue。重点是除非你重构这个以使用单个HttpClient实例,否则你将继续遇到端口耗尽。
来自MSDN Docs:
HttpClient is intended to be instantiated once and re-used throughout the life of an application. Especially in server applications, creating a new HttpClient instance for every request will exhaust the number of sockets available under heavy loads. This will result in SocketException errors.
答案 1 :(得分:1)
您应该使用Service Bus output binding从Azure功能向Service Bus发送消息。它将为您处理连接管理,因此您不应该遇到此类错误。