我正在使用Azure函数应用程序作为微服务。在同一个应用程序服务计划(EP 1)中部署了总共8个微服务。微服务是在.net core 7中开发的隔离(进程外)。这消耗了90%的内存。
大多数微服务都有Angular应用程序的API(端点)。很少有集成工作,将外部源的数据同步到cosmos DB。为此,我们实现了FUncycle应用程序的一些队列后台处理器和定时器触发器功能。
我观察到每个函数应用程序在低流量时消耗的内存范围(120-400 MB)。
本人有以下疑问-
- 如何检查功能应用程序的性能是否最佳?
- 从Function改为Web API,会让微服务变得更轻吗?
- 进程外FA是否消耗更多内存?我观察到它比进程内FA更重。
- 我如何确认Function应用程序中没有内存泄漏?我遵循SOLID主要标准,包括正确处理客户端[HTTP(singleton),ServiceBus CLinet,cosmos等]。
- Function应用程序是构建API(微服务)的正确方法吗?我们应该迁移到Web API吗?这会解决内存问题吗?
- 如果我们将微服务容器化,哪一个最适合上述场景?函数应用程序还是Web API?
**注:-**计划在下一季度转移到AKS,最有可能在明年3月。
由于内存消耗很高,服务总线连接正在关闭,cosmos change feed触发器失败。
下面是最重FA的依赖项。
<PackageReference Include="AspNetCore.HealthChecks.CosmosDb" Version="7.0.0" />
<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="Azure.Data.Tables" Version="12.8.1" />
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.16.1" />
<PackageReference Include="Azure.Storage.Blobs" Version="12.18.0" />
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.19.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.0.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.CosmosDB" Version="3.0.9" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.OpenApi" Version="1.5.1" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" Version="5.13.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.2.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.15.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="7.0.11" />
<PackageReference Include="Serilog" Version="3.0.1" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="7.0.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="7.0.1" />
<PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="4.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.Debug" Version="2.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.2" />
字符串
请建议最适合上述情况的解决方案。我正在收集数据点,如迁移到Web API是否有助于解决内存问题。我知道在不同的ASP中部署功能应用程序可以解决这个问题,但我想在迁移到AKS之前尽可能地降低基础架构成本。
1条答案
按热度按时间qv7cva1a1#
您可以在诊断和解决问题部分和Azure监视器部分中,通过将Function应用与Application Insights连接,检查Function应用的性能和内存泄漏:-
x1c 0d1x的数据
的
的
的
减轻内存泄漏的另一种方法是将Functions应用程序扩展到专用应用程序服务计划,而不是使用基于消费的计划。
x1c4d 1x的
您还可以避免为多个Function应用程序使用相同的存储帐户,并避免使用阻塞调用,使用等待操作完成的异步代码。
从Function更改为Web API不会使微服务更轻。由于可以在Azure容器应用程序中部署Functions,因此当您想要控制中间件时,Web API更好,依赖注入和路由。但Azure函数也支持依赖注入。您可以添加自定义中间件以在Azure函数触发器中与数据库交互。在-事实上,您可以在Function中调用外部Web和Rest API,并执行基于事件的任务。
进程外函数应用程序在独立于主机进程的进程中运行时,会比进程内函数应用程序消耗更多内存。这意味着进程外函数应用程序需要更多内存才能运行,因为它们需要将.NET运行时和其他依赖项加载到内存中。
由于Function App本身在无服务器架构上工作,因此它可以非常高效地作为容器化应用程序工作。您可以通过引用此MS Document将Function App容器化并从AKS运行它。在Function App中,您只需为触发器处于活动状态的时间付费,因为它基于无服务器架构。甚至Web API也可以使用Azure容器服务进行容器化。
关于最重FA的依赖关系,请考虑以下内容:
字符串