如何分离laravel应用程序的不同部分?

How to separate different parts of laravel application?

提问人:Lorenzo Lorini Kalil 提问时间:1/24/2023 更新时间:1/24/2023 访问量:112

问:

我有一个巨大的 Laravel 应用程序,它包含一个仪表板,用户在其中有许多不同的复杂 crud,这些 cruds 都保存在一个包含 100 多个表的数据库中,它还有一个用于移动应用程序的 api,可以达到每分钟 30 万个请求。随着应用程序的扩展,我遇到了性能问题,因为所有这些都在一个 aws 托管的 ec2 服务器中,我的意思是所有应用程序图像、公司徽标等、仪表板的所有资源和移动应用程序的所有 api。我需要解决这个问题,我应该在不同的机器上分开吗?如果是这样,如何?

所有应用程序当前都在 aws ec2 12xlarge 实例上运行 PHP 7.2 和 Laravel 5.5。

Laravel Amazon-Web-Services API 性能 扩展

评论

0赞 Yeak 1/24/2023
只需创建一个 S3 存储桶并将图像和文档放入 s3 存储桶中,您就可以在 AWS 上使用负载均衡器将实际代码托管在多个服务器上。另外,我建议您升级您的 laravel 5.5。它已经在第 9 版上

答:

0赞 Kaymaz 1/24/2023 #1

您正在问我们云中可扩展性的一些基本概念。

我会试着给出一个你可以遵循的方向。

由于以下几个原因,当前的设计非常糟糕:

  1. 正如您所说,它无法扩展,因为所有内容都保存在一台服务器中;
  2. 因为所有东西都保存在一台服务器中,所以我希望你有自动备份,以防你的实例失败
  3. 在此配置中,您唯一可以做的就是垂直扩展,而不是水平扩展(使用更多实例而不是大型实例)
  4. 文件位于同一磁盘上,因此无法缩放

在应用程序(Laravel)方面,您正在使用一个整体运行:所有内容都在一个应用程序中。我不需要告诉你它不能很好地扩展,但它可以。

让我们深入探讨主题:如何扩展这个大胖实例?

首先,您应该为图像使用共享空间。有 NFS(昂贵)、S3(便宜)和共享 EBS(比 NFS 便宜,但一次只能由有限数量的实例使用)。我会使用 S3。

我们可以跳过需要将单体应用程序重构为微服务架构的部分,其中包含较小的部分。如果你有时间和金钱,这是可以做到的,但我想说这不是你的扩展问题的优先事项。

我不知道数据库是否也在同一个 EBS 上。如果是,请使用 RDS:它是一个几乎没有管理的托管数据库。您可以使用多可用区来实现非常高的可用性,也可以使用多可用区数据库集群(新),它将读取负载分散到 2 个影子实例中。

为了进一步开发您的应用程序,您还可以在单独的实例上运行移动和 Web,以避免一个实例影响另一个实例。

和。。。就这样!Laravel具有透明的配置机制,可以轻松地将存储从一个切换到另一个。

当我说“仅此而已”时,我的意思是改善缩放的方式。 您必须将数据从 EC2 数据库迁移到 RDS,执行映像从 EBS 到 S3 的传输,创建自动扩展组,为您的 EC2 自动扩展组创建 IAM 实例角色以访问 S3,知道应用程序何时出现峰值,以便您可以进行预测性扩展等。

为此,我会建议使用 IaC,例如 CloudFormation 或 Terraform。

这只是冰山一角,但我希望你能用这些技巧开始构建一个更强大的系统。