我的团队一直在尝试让我们的一些 WebJobs自定义队列处理器具有单例行为,但我们还没有真正通过[Singleton(Mode = SingletonMode.Listener)]
属性获得这种行为,也没有通过设置来获得这种行为QueueProcessorFactoryContext.BatchSize = 1
。这导致每晚的进程一次猛击数据库——其中许多超时——并且已经变得有点令人头疼。
这或多或少是我们的 CustomQueueProcessorFactory 的样子:
public class CustomQueueProcessorFactory : IQueueProcessorFactory
{
public QueueProcessor Create(QueueProcessorFactoryContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (context.Queue.Name == Constants.UploadQueueName
|| context.Queue.Name == Constants.BuildQueueName)
{
context.BatchSize = 1;
}
return new QueueProcessor(context);
}
}
这是在配置我们的 JobHost 时引用的:
var config = new JobHostConfiguration();
config.Queues.QueueProcessorFactory = new CustomQueueProcessorFactory();
我们还用QueueTrigger
s 设置了一些函数,例如:
public static async Task ExecuteBackgroundRequest([QueueTrigger(Constants.BackgroundQueueName)] BackgroundRequest background, TextWriter logger)
{
await ExecuteRequest(background, logger);
}
[Singleton(Mode = SingletonMode.Listener)]
public static async Task ExecuteUploadRequest([QueueTrigger(Constants.UploadQueueName)] BackgroundRequest background, TextWriter logger)
{
await ExecuteRequest(background, logger);
}
[Singleton(Mode = SingletonMode.Listener)]
public static async Task ExecuteBuildRequest([QueueTrigger(Constants.BuildQueueName)] BackgroundRequest background, TextWriter logger)
{
await ExecuteRequest(background, logger);
}
我们正在使用包Microsoft.Azure.WebJobs
(+ .Core
, .Extensions
) v2.0.0 和WindowsAzure.Storage
v8.0.0,它们有些过时了,所以我一直在探索的一个潜在解决方案是更新 WebJobs 的最新稳定版本 (v3.0.4)。这打开了一个全新的蠕虫罐,因为配置已经完全重做,所有的类都被移动了。文档似乎稀疏/分散,所以我还没有确定在哪里(或者即使)我可以在每个 QueueProcessor 的基础上自定义属性,比如将某些队列的 BatchSize 设置为 1,而将其他队列设置为更高。
是否有一些 WebJobs 版本可以使用上述 CustomQueueProcessorFactory 逻辑来限制 BatchSize?或者 Singleton 属性实际上会确保一次只有一个后台进程访问特定队列?可以在最新版本的 WebJobs 中配置 QueueProcessorFactories 吗?
对任何这些问题的帮助将不胜感激!