服务总线队列的性能问题
Performance issue on Service bus queue
我每秒有大量消息发送到我的服务总线队列。我正在使用以下代码发送消息:
var message = new Message(body);
var result = await queueClient.SendAsync(messageOne)
我遇到了性能问题,我可以做些什么来优化代码吗?
P.S。 - 我刚加入公司,刚接触 Azure。
您可以参考 this 文档来优化您的代码。
执行操作(发送、接收、删除等)需要一些时间。除了请求和响应的延迟之外,此时间还包括服务总线服务对操作的处理。要增加每次操作的数量,操作必须并发执行。
客户端通过执行异步操作来调度并发操作。下一个请求在上一个请求完成之前开始。以下代码片段是异步发送操作的示例:
var messageOne = new Message(body);
var messageTwo = new Message(body);
var sendFirstMessageTask =
queueClient.SendAsync(messageOne).ContinueWith(_ =>
{
Console.WriteLine("Sent message #1");
});
var sendSecondMessageTask =
queueClient.SendAsync(messageTwo).ContinueWith(_ =>
{
Console.WriteLine("Sent message #2");
});
await Task.WhenAll(sendFirstMessageTask, sendSecondMessageTask);
Console.WriteLine("All messages sent");
以下代码是异步接收操作的示例。
var receiver = new MessageReceiver(connectionString, queueName, ReceiveMode.PeekLock);
static Task LogErrorAsync(Exception exception)
{
Console.WriteLine(exception);
return Task.CompletedTask;
};
receiver.RegisterMessageHandler(
async (message, cancellationToken) =>
{
Console.WriteLine("Handle message");
await receiver.CompleteAsync(message.SystemProperties.LockToken);
},
new MessageHandlerOptions(e => LogErrorAsync(e.Exception))
{
AutoComplete = false,
MaxConcurrentCalls = 20
});
我每秒有大量消息发送到我的服务总线队列。我正在使用以下代码发送消息:
var message = new Message(body);
var result = await queueClient.SendAsync(messageOne)
我遇到了性能问题,我可以做些什么来优化代码吗?
P.S。 - 我刚加入公司,刚接触 Azure。
您可以参考 this 文档来优化您的代码。
执行操作(发送、接收、删除等)需要一些时间。除了请求和响应的延迟之外,此时间还包括服务总线服务对操作的处理。要增加每次操作的数量,操作必须并发执行。
客户端通过执行异步操作来调度并发操作。下一个请求在上一个请求完成之前开始。以下代码片段是异步发送操作的示例:
var messageOne = new Message(body);
var messageTwo = new Message(body);
var sendFirstMessageTask =
queueClient.SendAsync(messageOne).ContinueWith(_ =>
{
Console.WriteLine("Sent message #1");
});
var sendSecondMessageTask =
queueClient.SendAsync(messageTwo).ContinueWith(_ =>
{
Console.WriteLine("Sent message #2");
});
await Task.WhenAll(sendFirstMessageTask, sendSecondMessageTask);
Console.WriteLine("All messages sent");
以下代码是异步接收操作的示例。
var receiver = new MessageReceiver(connectionString, queueName, ReceiveMode.PeekLock);
static Task LogErrorAsync(Exception exception)
{
Console.WriteLine(exception);
return Task.CompletedTask;
};
receiver.RegisterMessageHandler(
async (message, cancellationToken) =>
{
Console.WriteLine("Handle message");
await receiver.CompleteAsync(message.SystemProperties.LockToken);
},
new MessageHandlerOptions(e => LogErrorAsync(e.Exception))
{
AutoComplete = false,
MaxConcurrentCalls = 20
});