我应该使用一个或多个Azure WebJobs

时间:2016-12-13 15:56:40

标签: c# azure azure-webjobs azure-servicebus-topics

我有一个将消息发布到Azure Service Bus主题的系统。该主题有多个订阅者,我正在编写一个webJob来处理消息。

当我在Visual Studio中关注一个新的WebJob项目时,我得到一个名为'functions.cs'的类,它有代码来检查队列。我已更新代码以检查主题中的订阅:

public static void ProcessTopicMessage([ServiceBusTrigger("topic-name", "subscription-name")] string message, TextWriter log)
{
    // Processing goes here
}

该主题有多个订阅,我需要监控这些订阅,然后对收到的每条消息执行不同的操作。这将涉及通过API连接到第三方服务,API是每个订阅的不同API。

示例:

topic-name
    subscription-1  // Perform action #1
    subscription-2  // Perform action #2
    subscription-3  // Perform action #3
    ...

我的问题是:我应该为每个订阅编写单独的WebJob,还是应该在'functions.cs'类中添加其他方法?

我想知道如果我在同一个WebJob中有多个方法,并且我需要使这些方法不同步,性能是否会降低。

2 个答案:

答案 0 :(得分:1)

  

我的问题是:我是否应该为每个订阅编写单独的WebJob,或者我应该在' Functions.cs'中添加其他方法。类?

根据您的要求,您有多个订阅,订阅相同的主题,每个订阅具有不同的逻辑来处理相同的消息。

根据我的理解,由于多个订阅共享相同的配置(Azure ServiceBus的应用程序设置),并且每个订阅处理类似的逻辑。多个函数可以重用可以扩展到多个实例的同一主机。我认为同一个WebJob中的多个函数对你来说是更好的方法。

  

我想知道如果我在同一个WebJob中有多个方法并且我需要使这些方法异步,性能是否会降低。

众所周知,JobHost会在您的函数被触发时从托管线程池启动一个线程。您可以配置从ServiceBus处理消息的最大并发调用数,如下所示:

ServiceBusConfiguration.MessageOptions.MaxConcurrentCalls=20 //16 by default

由于您将调用第三方API,因此可以将您的函数标记为异步,以提高WebJob的可伸缩性。此外,还有issue关于性能的异步,您可以参考它。

答案 1 :(得分:1)

为每个订阅或一个Web作业创建一个Web作业取决于您的要求。

例如:

处理请求需要多长时间?

回答此问题将确定是否有多个订阅会对性能产生重大影响

这次是否有SLA?

如果每个请求都有SLA,那么您可能需要为每个订阅将Web作业扩展为不同的作业,否则,一个就足够了

每个订阅都有特殊配置吗?

如果所有订阅共享相同的连接,配置,那么您可能不需要为每个订阅单独的Web作业。

您也可以使用策略模式,并将每个订阅移动到自己的类中,以实现特定于每个订阅的逻辑