我正在研究一个场景,我们需要将大约 1k 条消息/秒的容量发布到 Azure 服务总线中的主题上。目前发送是这样完成的:
var messageList = GetMessagesFromDb(); // Gets serialized message content stored in the db
var sender = _serviceBusClient.CreateSender(topicName);
var serviceBusMessages = messageList.Select(x => new ServiceBusMessage
{
MessageId = Guid.NewGuid().ToString(),
Body = BinaryData.FromObjectAsJson(JsonConvert.DeserializeObject<EventWrapper>(x.MessageContent)),
ContentType = "application/json",
ApplicationProperties =
{
{ "EventId", x.EventId }
}
}).ToList();
await sender.SendMessages(serviceBusMessages);
使用
System.Diagnostics.Stopwatch
我已将发送时间限制在每秒 50-200 条消息之间,这似乎异常缓慢。有没有更好的方法来实现更高的吞吐量?消息大小不是很大,通常由具有 5-30 个数据字段的 JSON 组成。
我为标准(非高级)服务总线解决此问题的一种方法是启用分区,将消息拆分为多个块发送,然后为每个块并行调用
SendMessages
。我不记得最佳并行度,但你可以做一些测试。
var chunks = serviceBusMessages.Chunk(50);
var tasks = new List<Task>();
foreach (var chunk in chunks)
{
tasks.Add(sender.SendMessages(chunk));
}
await Task.WhenAll(tasks);