分布式基于云的架构中常见的性能错误
如何避免基于云的架构引入的痛点
任何云分布式应用程序的性能都是成功用户体验的关键。因此,深入了解如何衡量性能以及使用什么度量 IO 模式非常重要。在本文中,我们将介绍以下内容:
绩效分析清单和策略
性能问题检测和工具
性能反模式以及如何缓解问题
云清单中的性能监控
在提高应用程序或基础架构架构的性能时,请使用以下清单:
在您的应用程序和基础设施组件中引入日志记录工具
查找代码和基础架构的反模式和瓶颈
设置监控工具以收集 CPU、内存和存储利用率
调整监控工具以收集有关基础组件之间事件的信息
不要记录一切——确定要记录的重要事件
最常见的应用程序性能反模式
性能检查表中最重要的一项是识别反模式。一旦您已经知道弱点,这将节省宝贵的时间。
爱管闲事的邻居
假设您有一个部署为 Docker 容器的微服务,它比其他容器消耗更多的 CPU 和内存。这可能会导致中断,因为其他服务可能无法获得足够的资源。例如,如果您使用 Kubernetes,它可能会杀死其他容器以释放一些资源。您可以通过在设计和实施阶段的最初阶段设置 CPU 和内存限制来轻松解决此问题。
无缓存
一些倾向于在高负载下工作的应用程序不包含任何缓存机制。这可能会导致获取相同的数据并过度使用主数据库。您可以通过在应用程序中引入缓存层来解决此问题,它可以基于 Redis 缓存或仅基于内存缓存模块。当然,您不需要到处使用缓存,因为这可能会导致数据不一致。有时,您可以通过简单地向代码添加输出缓存来提高性能。例如:
namespace 域名rollers { [HandleError] public class HomeController : Controller { [OutputCache(Duration=10, VaryByParam="none")] public ActionResult Index() { return View(); } } }
上面,我已将输出缓存属性添加到 MVC 应用程序。它将缓存静态内容 60 秒。
繁忙的数据库
当所有服务都在 Kubernetes 集群中并通过容器部署但它们都使用单个数据库实例时,这个问题经常出现在现代微服务架构中。您可以通过确定每个微服务的数据范围并将一个数据库拆分为多个来解决此问题。您还可以使用数据库池机制。例如,Azure 提供 Azure SQL 弹性池服务。
重试风暴
重试风暴及其引起的问题通常发生在微服务或云分布式应用程序中;当某个组件或服务离线时,其他服务会尝试访问它。这通常会导致永无止境的重试循环。但是,它可以通过使用断路器模式来修复。断路器的想法来自无线电电子学。它可以作为一个单独的组件来实现,就像一个自动开关。当电路遇到问题(如短路)时,开关会关闭电路。
示例:导致中断的云性能监控架构
要检查架构的性能,您需要对应用程序运行负载测试。在下面,您可以看到一个基于 Azure 应用服务和 Azure 函数的架构示例。该架构包含以下组件:
分为四个阶段:开发、测试、登台和生产。
登录和监控使用 Prometheus 和 Grafana 实现
加载测试是通过 Azure DevOps 和 JMeter 实现的
在这里,您可以找到如何在 Azure DevOps 中设置JMeter 负载测试的示例。
图1
解决问题
正如您在图中所见,乍一看,一切都很好。你认为哪里可能有问题?您可以在图 2 中看到该图的固定架构。
图2
首先,您永远不应该针对生产阶段运行负载测试,因为当您运行过度负载测试时,它可能(并且经常会)导致停机。相反,您应该针对测试或暂存环境运行测试。
您还可以为负载测试目的明确创建生产环境的副本。在这种情况下,您不应使用真实的生产数据,因为这可能会导致向真实客户发送电子邮件!
接下来,让我们看一个应该在高负载下构建的应用程序。
示例:AKS 上的高负载应用程序架构
想象一下,我们有一个流行的电子商务应用程序需要在黑色星期五生存。
应用程序架构应基于以下组件:
带有Kubernetes Cluster Autoscaler 的Azure Kubernetes 服务 (AKS)被用作主要的分布式环境和机制,以在负载下扩展计算能力。
Istio 的服务网格用于提高集群可观察性、流量管理和负载均衡。
Azure Log Analytics 和 Azure 门户仪表板用作中央日志记录系统。
图 3
在上图中,您可以看到 AKS 群集包含在后台表示为虚拟机的节点。Autoscaler 是这里的主要组件。当集群处于高负载时,它会增加节点数。当集群处于正常负载时,它还会将节点缩小到标准大小。
Istio 提供数据平面和控制平面,协助完成以下工作:
负载均衡
TLS 终止
服务发现
健康检查
身份和访问管理
配置管理
监控、日志和流量控制
请注意,该架构当然包括 Dev、Test、Staging 和 Production 阶段。高可用 Kubernetes 集群的公式是每个阶段都有单独的集群。但是,对于 Dev 和 Test,您可以使用由命名空间分隔的单个集群来降低基础架构成本。
为了进一步加强日志记录,我们使用 Azure Log Analytics 代理和门户来创建仪表板。Istio 包含许多现有指标,包括性能指标和自定义它们的选项。然后,您可以与Grafana仪表板集成。
最后,您还可以使用 Istio 设置负载测试。这是一个很好的例子。
顶级开源应用程序监控工具
让我们首先列出一些最流行的开源应用程序性能工具:
Apache Sky Walking是一个强大的分布式性能和日志分析平台。它可以监控用 .NET Core、Java、PHP、域名、Golang、LUA、C++ 和 Python 编写的应用程序。它支持云集成并包含性能优化、慢速服务和端点检测、服务拓扑图分析等功能。请参阅下图中的特征图:
Scoter是一款功能强大的工具,可以监控 Redis、Nginx、Kafka、MongoDB、Kubernetes 等来源。它可以监控 CPU、内存网络和堆利用率、活跃用户、活跃服务等。
GoappMonotr是一个为 Golang 应用程序提供性能监控的工具。
Pinpoint是一个用于 Python、Java 和 PHP 应用程序的性能监控工具。它可以监控 CPU、内存和存储利用率。您可以将其集成到您的项目中,而无需更改任何一行代码。
Code Speed是一个简单的 APM 工具。它可以安装到您的 Python 应用程序中以监控和分析代码的性能。
有像Datadog这样的工具有社区许可证或试用版。此外,如果您使用的是 Azure,则可以根据带宽以低成本或完全免费启用 Azure AppInsights。