我试图在思想上转向无服务器的东西,但我发现自己不明白如何移植我现有的后端代码。我需要澄清以下假设:
- Azure Function 是否被视为单线程代码?
- 在函数内使用 TPL 和 PLINQ 总是一个坏主意吗?
- 与常规应用服务相比,
静态
成员的开销是多少? 基本上,我们对AppDomain
生命周期有任何保证吗? - 如果我使用 NLog 或 log4net 等日志记录框架,其异步附加程序需要专用线程,我需要担心什么吗?
- 如何监控每个函数运行占用了多少内存?
是否可以设置 DI 容器,以便将我的依赖项注入(inject)到
Run
方法中?类似这样的事情:[FunctionName("ServiceBusQueueTriggerCSharp")] public async Task RunAsync( [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "meconn")] string myQueueItem, IBusinessLogicService blService, ILogService logService, IMailingService mailService) { }
是否可以在
Run
方法中获取CancellationToken
以便我可以优雅地取消/关闭?
最佳答案
这取决于您所说的“单线程代码”的含义。在较高级别上,您应该查看在函数中编写的代码,类似于在 ASP.NET MVC Controller 方法中编写代码的方式。发生单个事件(例如 HTTP 请求),运行应用程序的特定计算机已收到该事件,并且您的代码描述了如何处理该事件。 Azure Functions 的动态扩展功能永远不会进行单次执行,并将该执行透明地分布到多个线程或计算机上。如果您的场景需要基于单个事件完成大量工作,那么您应该将工作拆分到多个功能中,以便系统可以对其进行扩展。最简单的方法之一是使用队列。
在很多情况下,使用 TPL 都是有效的。例如,您的函数可能会从 3 个不同的数据源提取数据并将其合并为一个结果。在这种情况下,并行启动这 3 个异步操作是有意义的。我对 PLINQ 不太确定。我想说的是,当您出于效率目的需要并行进行大量计算时,最好将这些计算拆分为单独的函数执行(例如,使用我上面提到的队列)。
您可以使用静态变量,基本上没有任何开销,但不能保证应用程序域的生命周期。因此,您需要准备好在需要时重新初始化这些变量。
Azure Functions 目前不公开每个函数的内存使用统计信息。有函数应用级别的使用统计信息,请参阅here获取信息。
Azure Functions 目前不支持 DI。
是的,只需将您的函数定义为返回任务的异步函数,并让它接受取消 token ,然后将一个取消 token 传递给您。
关于.net - 了解 Azure Functions 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760387/