我有一个将消息发布到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中有多个方法,并且我需要使这些方法不同步,性能是否会降低。
答案 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作业。
您也可以使用策略模式,并将每个订阅移动到自己的类中,以实现特定于每个订阅的逻辑