我的webapi必须执行一系列繁重的操作才能完成请求。为了最大限度地缩短处理时间,我将卸载"查看计数器增量"到webjob。
我目前正在这样做的方法是在每个请求结束时将带有userId和productId的消息排入azure队列存储。 webjob函数在新队列消息上触发,在解析消息后,它将值(增量或新增)添加到静态并发字典。
我没有递增并写入azure表,因为我想使用另一个基于计时器的webjob将值从并发字典持久化到表中,以避免过多写入。
虽然没有消息丢失并且所有值都被正确记录/添加到dict中,但我看到的性能非常差。处理1000条消息需要5分钟以上。 消息以突发方式进行,并且比我将BatchSize设置为1时并行处理速度慢。我的webjob设置为:
config.Queues.BatchSize = 32;
config.Queues.NewBatchThreshold = 100;
config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(2);
config.Queues.MaxDequeueCount = 3;
由于字典冲突,性能似乎没有受到影响,因为那些似乎处理速度很快。我的计时器显示处理每个增量需要0到9毫秒,因此1000条消息最多需要9秒。 webjob是否滞后/闲置,是否符合设计? webjob可以以什么最大速率处理队列?我可以调整任何其他设置以使webjob运行得更快吗?是否有其他方法可以解决这个问题"查看增量"任务,考虑到我可以有不同的userIds / productIds消息?
答案 0 :(得分:0)
在处理完一组消息后,在获取下一组消息之前,webjob进程似乎有延迟
据我所知,WebJobs使用特定的轮询算法轮询队列。找到消息后,SDK会等待两秒钟,然后检查另一条消息;如果没有找到任何消息,它会等待大约四秒钟再重试。有关详细信息,请查看this article中的轮询算法主题。
此外,您可以尝试在Azure App Service Web应用程序中运行WebJobs,并将WebJobs扩展到多个实例。