我有一个Azure WebJob,它循环遍历文件的页面并处理它们。该作业还有一个ICollector到输出队列:
[Queue("batch-pages-to-process")] ICollector<QueueMessageBatchPage> outputQueueMessage
我需要等到所有页面都被处理后再将所有页面发送到输出队列,因此我不是将每条消息添加到文件处理循环中的ICollector中,而是将消息添加到队列消息列表中: / p>
List<QueueMessageBatchPage>
在处理完所有页面后,我循环浏览列表并将消息添加到ICollector:
foreach (var m in outputMessages)
{
outputQueueMessage.Add(m);
}
但这最后一部分似乎需要很长时间。要添加300条队列消息,需要将近50秒。我没有多少可以衡量,但这似乎很慢。这是正常的吗?
答案 0 :(得分:1)
没有客观标准的缓慢与快速为您提供,但有一些想法:
a)部分排队时间将是每个QueueMessageBatchPage实例的序列化......其性能将与这些实例所代表的对象图的广度和深度成反比。更多数据显然需要更多时间来写入队列。
b)我知道您提到在处理完所有文件行之前您无法写入队列,但如果可能的话,您可能会重新考虑该选择。在某种程度上,您可以并行化文件中的行处理和后续写入输出队列(使用多个WebJob实例或单个WebJob实例中的TPL任务),您可以更快地完成这项工作。再一次,我意识到你已经预先说过你不能这样做,所以我只是建议你考虑一下这个选择的全部意义(如果你还没有)。
c)另一种可能性......确保存储队列所在的区域与WebJob所在的区域相同,以最大限度地减少延迟。
祝你好运!