在Owin Startup类中使用OnMessage订阅Azure Service Bus

时间:2016-11-06 20:59:51

标签: c# azure asp.net-web-api2 owin azureservicebus

我正在开发一个处理来自Azure Service Bus的消息的解决方案,我的同事建议使用我们现有的Asp.Net WebApi应用程序并在 OWIN Startup <订阅ASB / em>例如

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // ... registering WebApi etc

        var queueClient = SubscriptionClient.CreateFromConnectionString("connection string", "sometopic", "somesubscription");

        queueClient.OnMessage(m =>
        {
            //do something with message

            m.Complete();
        }, new OnMessageOptions
        {
            AutoComplete = false,
            AutoRenewTimeout = TimeSpan.FromSeconds(30),
            MaxConcurrentCalls = 30
        });
    }
}

我个人认为这不是正确的方法,而是我们应该使用 WebJobs WorkerRoles ,我无法想到任何争论让他相信我的想法。

所以问题是:

  1. 谁是对的,我或我的同事,或者两种解决方案都可以?
  2. 如果我的同事不对,反对他的解决方案的理由是什么?

2 个答案:

答案 0 :(得分:3)

如果该web api项目不只是监听此队列,请考虑使用Web作业或辅助角色方法的这些优势:

  • 工作人员角色可以独立于Web应用程序进行扩展
  • 可以独立于Web应用程序更新Web作业/辅助角色
  • 进程隔离:如果一个失败,另一个可能仍在运行。

如果您使用Azure功能(https://azure.microsoft.com/en-us/services/functions/),您甚至可以应用无服务器计算。您只需支付使用费(不是托管您的功能)和比例,也可以单独更新。

从技术上讲,这两种方法都有效。如果消息的处理直接与Web应用程序交互(您没有告诉您对消息做了什么),那么根据工作在Web应用程序中运行它可能更有意义。

网站更好地处理请求而不是运行连续过程。 Web作业/工作者角色对于这种情况来说感觉就像是一个更好的环境,但也真正看看Azure功能。

答案 1 :(得分:1)

服务总线存在的一个原因是孤立地处理此消息/队列,因为此特定进程被识别为较大企业系统的子系统或子域。因此,app / service(以web worker角色/ web作业/ azure函数的形式)可以由具有子系统的焦点领域知识的相同或不同团队开发。由于它是一个独立的过程,因此可以根据需要独立扩展。

如果消息的处理依赖于Web应用程序业务逻辑/服务,则可能是一个红色标记,说明为什么它需要在Web API过程中。