如何处理对azure服务总线的多次访问

时间:2017-11-02 15:05:50

标签: c# azure azure-functions azureservicebus

我的应用程序使用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(例如)次,则会出现错误。我怎么解决?

2 个答案:

答案 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发送消息。它将为您处理连接管理,因此您不应该遇到此类错误。