了解Azure Functions行为

时间:2017-06-26 13:00:20

标签: .net multithreading azure azure-functions azure-functions-runtime

我正在努力转向无服务器的事情,我发现自己不了解如何移植现有的后端代码。我需要澄清以下假设:

  1. Azure功能是否被视为单线程代码?
  2. 在函数中使用TPL和PLINQ总是一个坏主意吗?
  3. 与常规应用服务相比,static成员的开销是多少? 基本上,我们在AppDomain一生中有任何保证吗?
  4. 如果我使用日志框架,例如 NLog log4net ,其异步appender需要专用线程,我是否需要担心什么?
  5. 如何监控每个功能运行的内存量?
  6. 是否可以设置DI容器,以便将我的依赖项注入Run方法?这样的事情:

    [FunctionName("ServiceBusQueueTriggerCSharp")]                    
    public async Task RunAsync(
       [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "meconn")]
       string myQueueItem,
       IBusinessLogicService blService,
       ILogService logService,
       IMailingService mailService) {
    }
    
  7. 是否可以在CancellationToken方法中获得Run,以便我可以优雅地取消/关闭?

1 个答案:

答案 0 :(得分:4)

  1. 这取决于“单线程代码”的含义。在较高的层次上,您应该查看在函数中编写的代码,类似于在ASP.NET MVC控制器方法中编写代码的方式。发生单个事件(例如HTTP请求),运行应用程序的特定计算机已收到该事件,您的代码描述了如何处理它。 Azure Functions的动态扩展功能永远不会执行单个执行,并透明地将执行分配到多个线程或计算机上。如果您的场景需要根据单个事件完成大量工作,那么您应该将工作分成多个功能,以便系统可以将其扩展。最简单的方法之一是使用队列。

  2. 在许多情况下,使用TPL是有效的。例如,您的函数可能从3个不同的数据源中提取数据并将其合并为一个结果。在这种情况下,并行启动这3个异步操作是有意义的。我对PLINQ不太确定。我要说的是,当你有大量的计算需要并行发生以达到效率时,你最好将这些计算分成单独的函数执行(例如使用我上面提到的队列)。

  3. 您可以使用基本没有开销的静态变量,但不能保证应用程序域的生命周期。因此,您需要准备好在需要时重新初始化这些变量。

  4. Azure功能当前未公开每个功能内存使用情况统计信息。功能应用级别有使用情况统计信息,有关信息,请参阅here

  5. Azure功能目前不支持DI。

  6. 是的,只需将您的函数定义为异步函数,该函数返回一个任务并让它接受一个取消令牌,一个将传递给您。