为假人扩展后端应用程序
为假人扩展后端应用程序
也许您和每个开发人员一样,都面临过应用程序开始变慢并显示性能不佳的情况。
我知道,这很令人失望,但它只是发生了。当您开始在应用程序中工作并获得更多用户和请求时,将发生与过载、意外系统故障和服务停机相关的一些问题。完全没问题,这只是意味着您需要扩展您的系统。
如果您有足够的经验,您可能会根据以前的项目预先计划一些场景,这是一个非常好的起点,因为这意味着您的架构至少在某些时候是可扩展的。
如果您不熟悉这个概念,请不要担心,我创建了一系列文章,从基础介绍一些扩展应用程序的概念。
规模……什么?
在进一步讨论之前,我认为是时候澄清一些概念了。
当我们谈论软件开发中的扩展时,我们指的是添加更多资源(硬件)以运行特定应用程序的操作。
但如果我的程序运行完美,我为什么需要扩展?
好问题!通常,当您开发应用程序时,您会在特定上下文中执行此操作,并且当此上下文更改时,您的应用程序可能会受到影响。
让我用一个例子来解释。您正在编写像 Shopify 这样的电子商务。一开始你没有注意数据库性能,完全没问题,应用程序有几个用户,响应时间相当好。有一天,性能下降了,您意识到在营销活动之后,您的应用程序现在同时拥有 10 万用户。你的应用程序是一样的,但它不像以前那样工作,所以发生了什么……完全正确!您的应用程序运行的上下文已更改。
这些情况往往会不时发生。这就是为什么从一开始就关注应用程序的性能和可扩展性如此重要的原因。
我并不是说您应该从一开始就创建下一个 Google 或 Facebook,并在全球拥有数据中心,但您需要一种策略和工具来扩展您的应用程序。这就是本系列文章存在的原因。
如何扩展我的应用程序?
现在我们在同一页面上,所以是时候深入探讨可伸缩性概念了。
首先,我想描述扩展应用程序时的典型流程。
扩展应用程序的第一部分是了解它在后台发生了什么。换句话说,我们需要找到导致性能下降的原因,以便为问题应用解决方案。
第二部分显然是应用解决方案。在这一点上,我们真的很幸运,因为有很多解决方案记录在案,可以帮助我们扩展应用程序。
如果你问我这个过程的简要总结应该是这样的:
- 分析:
- 启用可观察性工具
- 进行根本原因分析
2.改进:
- 优化代码和业务逻辑
- 优化数据库使用(例如慢查询)
- 使用后台处理
- 应用高级缩放模式
在本文和以下文章中,我们将涵盖该过程的所有这些方面和阶段。让我们开始讨论可观察性。
启用可观察性工具
这听起来很明显,但事实并非如此。
在对缩放问题应用任何解决方案之前,您需要知道问题出在哪里以及是什么原因造成的。我们应该根据问题应用不同的解决方案。我们不会对数据库中的慢查询和无法处理更多请求的过载服务器应用相同的改进。
因此,首先您需要审核您的应用程序。在最好的情况下,您的应用程序有一些可观察性工具,如 Kibana、Grafana、Prometheus 或类似工具。如果是这样,那么您很幸运,因为您可以检查此数据以发现问题。如果没有,我的建议是您现在需要实施一个可观察性工具。
因为这篇文章是对一般概念的介绍,所以我不会更深入地解释如何安装和使用这些工具。您在互联网上有数百篇关于它的文章。但我想就应该收集哪些数据来获得应用程序的良好可观察性提供一些提示。
您想了解的有关您的应用程序的最重要信息是:
- 应用程序 ID:识别您的应用程序,以防您有很多应用程序
- 请求状态:真/假或错误代码,由您决定
- 请求时间:从请求开始到结束所经过的时间,以秒或毫秒为单位
- 服务器信息:服务器名称/集群 ID 或类似信息,帮助您发现特定问题
- 分析信息:有关运行应用程序的某些方法或类的时间、调用外部 API 等的信息。
您应该为每个请求收集此信息。如果您的应用有大量请求,请考虑为至少 10%-20% 的请求收集数据。您可以将此信息存储为日志,但如果您使用可观察性工具来显示它,您将更有效率,因为您可以一目了然地获得所有数据。
如果您想让您的可观察性更上一层楼,您可以查看 APM 库。 APM 允许您通过使用库的几行代码从您的应用程序中收集低级信息,例如错误和堆栈跟踪。这些库可用于大多数编程语言和框架,并与所有可观察性工具兼容。
在本节中,我们应该提到另一个对处理性能问题非常有用的信息来源,它是经典的服务器监控。这些信息通常可以通过特定的服务器监控应用程序获得,例如 Nagios、Centreon、Zabbix、Pandora FMS 或更通用的应用程序,例如上面提到的可观察性工具。
这些有关 CPU、RAM、网络等资源使用情况的信息可以为您提供有关应用程序性能的大量信息,并帮助您分析问题。因此,在对应用程序进行性能分析时,不要低估此类信息。
通过对应用程序内部发生的所有情况的深入了解,我们可以发现性能问题并开始进行改进。
进行根本原因分析
现在,您拥有所有可用信息,您需要开始搜索问题。
根据我的经验,与应用程序性能差有关的典型问题通常是由以下原因引起的:
- 对耗时过长的外部 API 的请求
- 未优化的数据库查询
- 不可扩展的代码
- 缺乏资源
第三方请求的问题应该很容易发现,因为它们往往是一致的。通常它们是由供应商系统中的问题引起的,可能是暂时的或结构性的。除了更容易发现之外,这些问题也不是那么容易解决的,主要是你无法控制这个 API 的代码。所以基本上你应该联系你的供应商,看看他们能做什么。如果你足够幸运并且它是由另一个团队开发的内部 API,那么只需喝杯咖啡并与你的同事交谈,看看发生了什么以及如何提供帮助。
如果您的问题与非最优查询有关,那么方法就完全不同了。您应该使用一些“解释”命令根据您的数据库引擎分析您的查询并寻找一些改进。我们将在以下几节中介绍这个主题。
另一个典型的问题是代码不是最优的,这很笼统,我知道……但是根据我的经验,很多问题是由在业务逻辑和资源使用方面没有优化的代码引起的。一些例子是:在同一个请求期间重复查询,在请求中执行可以延迟的业务逻辑,遗留代码无用但未重构,等等......
如果您有正确的可观察性,有时很容易发现缺乏资源的问题。有时即使您的代码、查询等经过优化和完善,您也可以达到数据库引擎、Web 服务器等的限制。在这种情况下,您会看到错误消息,例如“已达到连接限制”。我们将在以下部分探讨解决这些问题的一些选项。
使用可观察性信息,您应该能够轻松识别问题并且很容易。一旦你这样做了,下一步就是知道如何开始解决它们。
通过提高代码性能进行扩展
首先,我想谈谈代码性能,因为在我看来,这是最容易解决的问题,但却是人们最后解决的问题。
在优化数据库查询或对代码进行重大重构或改进硬件之前,您应该查看已实现的业务逻辑。
但是……您应该寻找什么?好问题!我可以给你一个例子列表:
- 在同一个请求期间重复执行代码,结果应该被缓存,不要重复同样的事情
- 不再需要遗留代码,但它正在执行,立即将其删除
- 重量级循环或多次迭代同一个集合,尝试尽可能少地循环集合,并尽可能避免循环循环
这些技巧是最常见的陷阱,但肯定有很多不好的做法需要避免。这是一门入门课程,因此应将其视为示例,以指导您进行根本原因分析。
如果您改进了这些问题,您可以通过较少的努力获得更高的性能,而无需进行大量的重构,甚至无需花费大量资金来为您的服务器获得更多功能。
通过提高数据库性能进行扩展
第二名是查询性能优化。
以我的经验,使用数据库时最常见的问题之一就是编写结构或插入信息而不关注性能。
例如,创建正确的索引可以使您的应用程序快 10 倍。
因此,确保您拥有正确的索引以及您的查询和数据结构是最佳的以充分利用您的数据库引擎至关重要。
我不会深入探讨数据库优化,因为这是一篇介绍性文章。您的数据库引擎有很多在线资源
通过利用后台处理进行扩展
当您的代码和数据库查询得到优化并且您的流程的某些部分仍然需要很长时间时,您就有了最后的灵丹妙药……您可以尝试后台处理。
业务逻辑的某些部分可能会减慢您的应用程序请求,例如日志记录、插入大量数据等。有时这些操作不属于请求的业务逻辑,您可以推迟它们。
一个很好的例子是“创建用户”请求,它在同一个请求中发送欢迎电子邮件。在这种情况下,请求只需将用户信息插入数据库并在完成后返回 OK,您可以在几秒钟后使用后台进程发送电子邮件。
但是..你怎么能做到呢?好的,这比看起来容易。
您可以使用任何可用的消息队列服务器(如 RabbitMQ、Kafka、AWS SQS 等)来实现事件总线模式。
这个想法是在主请求中发送一个通知某些操作的事件,例如“用户创建”。然后,您将有一个单独的进程,通常是一个守护进程,在后台运行以侦听这些事件,例如发送欢迎电子邮件的“WelcomeEmailSenderListener”。
使用后台处理可以使您的请求更快,它允许您扩展系统的每个部分,分别分配他们需要的资源。
一些高级缩放模式
当您实现上述所有技术并且您的应用程序继续表现非常糟糕时,您需要应用一些高级缩放模式。这些模式将帮助您获得应用程序的性能。
其中一些模式是:
- 实现一些缓存系统
- 垂直扩展服务器
- 水平扩展服务器
- 实现数据库分片
我们将在下面的文章中深入介绍这些模式,但为了给您做一个简要介绍,所有这些模式都是基于提高运行应用程序所需的硬件资源的使用率。
在现实世界中,我们混合和匹配以充分利用它们,因此您最终将获得更复杂的基础架构和应用程序,但另一方面,您将拥有一个更可靠的系统,允许您增加请求数量和用户毫不费力。
结论
扩展对于确保您的应用程序可以处理大量请求和大量用户非常重要,这是业务运行良好的一个好兆头。
启用良好的可观察性以从应用程序中收集性能数据是了解应用程序性能低下原因的关键。
在添加更多硬件来运行应用程序之前检查代码和数据库性能是一种很好的做法。一些易于修复的问题,例如删除遗留代码、重构业务逻辑或在数据库中创建一些索引,可以将您的应用程序性能提高十倍。
您可以通过使用更高级的缩放模式(例如:缓存、垂直和水平缩放、分片等)来提高应用程序性能,这些模式可以让您充分利用运行应用程序所使用的硬件。
这是涵盖扩展应用程序某些方面的系列文章的第一篇,您将在下一篇文章中找到有关如何扩展应用程序的更多信息。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明