2

我正试图对无服务器的东西进行心理转变,但我发现自己不明白如何移植我现有的后端代码。我需要澄清以下假设:

  1. Azure 函数是否被视为单线程代码?
  2. 在函数中使用 TPL 和 PLINQ 总是一个坏主意吗?
  3. static与常规应用服务相比,会员的开销是多少?基本上,我们对AppDomain寿命有任何保证吗?
  4. 如果我使用诸如NLoglog4net之类的日志框架,其异步附加程序需要专用线程,我需要担心什么吗?
  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. 是否有可能获得一个CancellationTokeninRun方法,以便我可以优雅地取消/关闭?

4

1 回答 1

5
  1. 这取决于您所说的“单线程代码”是什么意思。在较高级别上,您应该查看在函数中编写的代码,类似于在 ASP.NET MVC 控制器方法中编写代码的方式。发生单个事件(例如 HTTP 请求),运行您的应用程序的特定机器已收到该事件,您的代码描述了如何处理它。Azure Functions 的动态缩放功能永远不会执行单次执行,而是透明地将执行分发到多个线程或机器上。如果您有一个必须基于单个事件完成大量工作的场景,那么您应该将您的工作拆分为多个功能,以便系统可以扩展它。最简单的方法之一是使用队列。

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

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

  4. Azure Functions 当前不公开每个函数的内存使用统计信息。函数应用级别有使用统计信息,请参阅此处了解信息。

  5. Azure Functions 当前不支持 DI。

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

于 2017-06-26T20:13:26.043 回答