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