Azure WebJobs有很多QueueTrigger不好的做法?

时间:2017-04-17 14:34:17

标签: .net azure asp.net-web-api queue azure-webjobs

目前我正在使用asp.net开发一个WebApi项目。我想将所有非时间关键和长时间运行的操作移动到webjobs中,以保持我的API快速简单。

例如,在创建特定资源时,会立即创建(实体状态:创建/配置),并且新队列消息将被排队。现在,webjob在队列上接收消息并从配置任务开始。作业成功/失败后,资源/实体将更新(状态:已完成/失败)。

没什么特别的。但是现在我还想把实现统计数据,报告等部分转移到现在即时计算和计算的工作中。

当我将所有不重要的任务移动到不同队列中的webjobs时,例如:

ProvisioningQueue UpdateStatisticsA CreateReportB ...

一次拥有这么多队列(20-50)是不好的做法(它们将一直被轮询/检查)。为清楚起见:每条消息的队列。遗憾的是,我没有找到任何方式/示例如何创建多个工作函数,这些工作函数可以监听同一个队列,但使用不同的消息。我也没有找到任何关于使用许多队列的好/坏。仅包含1-3个作业功能的示例(图像转换,调整大小......)。

天蓝色的服务总线听起来也不错(因为主题)。我不确定我是否正确使用webjobs和存储队列。我想要的是将许多非时间关键和长时间运行的任务与webapi分离。

谢谢大家!

1 个答案:

答案 0 :(得分:1)

使用多个队列完全没有问题,每个队列都有一个需要处理的单独消息类型。

有两种处理来自这些队列的消息的方法:将所有队列监视方法抛出到单个webjob中,或将每个队列的监视器拆分为自己独立的webjob。我个人喜欢将队列监视器拆分为单独的webjobs,因为它使您能够在需要时将webjobs移动到单独的Web Apps。例如,假设您有WebJobs A,B和C,它们正在监视队列A,B和C.如果A的工作负载一直很繁重,并且B和C总是负载很轻,您可以将A移动到单独的Web应用程序在不同的应用程序服务计划上,而B和C可以共享Web应用程序。这是一种微服务方法。

在这种情况下,主题不会有用。

服务总线是一种很好的方式,您需要保证至少一次,最多一次交付。此外,您可以轻松拥有一个包含不同消息类型的Service Bus队列(如果您想这样做)。您通过BrokeredMessage类实例在Service Bus中发送消息。您可以为每个消息类型创建BaseMessage类,子类BaseMessage,通过序列化为JSON(或您想要使用的任何格式)通过BrokeredMessage打包消息,然后测试以查看在出列操作期间您拥有的子类。