热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇

本文将介绍亚马逊云快速搭建基于无服务器服务AmazonLambda的方案优


概览


上一篇我们介绍了WordPress的电商插件WooCommerce和如何快速在亚马逊云快速搭建基于无服务器服务Amazon Lambda的方案,这篇我们来介绍本方案的优势,并进行负载测试。



使用Serverless构建独立站的优势


在传统架构模式下,如果需要进行电商大促需要提前预置计算资源以支撑高并发访问,会造成计算资源浪费并且增加运维工作量。


本文介绍一种新的部署方式,将WordPress和WooCommerce部署在https://www.apple.com/careers/cn/work-at-apple.html中。Lambda是无服务器的计算方式,无需预置资源就可以运行代码,自动响应任何规模的代码执行请求,从每天十几个事件到每秒数十万个事件,按计算时间付费(以毫秒为单位),真正做到按使用量计费,从而达到节省预置资源和运维成本。


Amazon Lambda的这种特性,让Lambda越来越受欢迎,越来越多的客户选择Lambda来部署应用,其中也包含web应用。了解Lambda的客户可能清楚,Lambda是基于事件触发的方式,对于web应用,需要使用API Gateway,接收HTTP请求,把HTTP请求转化为Lambda事件触发Lambda运行。


在以前,对于已有的Web应用,需对应用代码进行轻量级的改造以处理Lambda事件。对于很多使用像WordPress和WooCommerce这样的成熟组件的电商客户来讲,进行代码改造不太可能,是不是就不能利用Lambda的优势了呢?答案是否定的。利用Lambda的新功能Lambda container images和开源组件Amazon Lambda adapter可以让WordPress在Lambda中运行且无需进行任何代码的修改。


本解决方案通过将Lambda Adapter,WordPress,WooCommerce以及其他必要插件打包成容器,部署到Lambda。同时本解决方案也利用了Lambda的新功能,Function URL,来代替API Gateway,可以直接通过Function URL来通过HTTP(s)访问Lambda,从而节省API Gateway带来的成本。用户的动态请求,通过CloudFront回源到Lambda URL触发Lambda运行,在Lambda内部,Lambda Adapter接收到Lambda事件并将其转换成WordPress能处理的HTTP请求。这样就实现了无需修改代码就能在Lambda中运行WordPress。


本文着重介绍Lambda container image和Lambda Function URL,关于Lambda Adapter的实现细节请参考这篇博客。


Lambda container image


要将容器运行在Lamabda,容器映像需包含运行时API的runtime interface clients,用于管理 Lambda 和函数代码之间的交互。客户可以自行将runtime interface client包含在自己的映像以支持在Lambda运行。亚马逊云科技 提供了一组可用于创建容器映像的开源基础映像。这些基本映像包括runtime interface clients 。Lambda映像是只读的,但函数代码可以访问具有 512 MB 存储空间的可写 tmp 目录。本方案使用Docker来创建映像。Dockerfile里使用亚马逊云科技提供的基础映像Amazon Linux 2,并使用bedrock来管理WordPress和插件的安装。本方案中预配置了一些必要插件,客户可以修改bedrock的配置添加所需要的插件。


runtime interface clients:

https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html#runtimes-api-client

基础映像:

https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/runtimes-images.html#runtimes-images-lp

runtime interface clients :

https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html#runtimes-api-client


Lambda Function URL


现在可以通过创建Function URL,支持使用HTTP(s)来访问这个URL来触发Lambda运行。在Function URL这个功能没有发布的时候,基于Lambda构建Web应用需要结合API Gateway来接收HTTP(s)请求。但是在Lambda上部署WooCommerce的场景下,因为是把WordPress等打包成一个容器,因此只需要单个Lambda Function,API gateway的作用只是把HTTP请求转化为Lambda事件,而API Gateway提供的高级功能,例如API管理,请求验证等,并不需要。因此有了Function URL的功能,就能够取代API Gateway在此场景下的作用,并且不会增加Lambda的费用,同时也节省了API Gateway的费用。


负载测试


在上一篇博客的基础上,我们使用WordPress的插件Blocksy快速构建一个Starter Site,并使用这个Site来作为测试对象。

本方案已经开源在Github,访问此Repohttps://github.com/aws-samples/serverless-WooCommerce-workshop)可获得完整代码。


在test/k6文件夹内,本方案也提供了进行性能测试的k6脚本。模拟了用户进入主页,选择商品,并加入购物车,更新地址,到提交订单的完整流程。具体说明参考test/readme.md文件。

main.js作为测试的入口文件,模拟了前5分钟100个用户在线,中间10分钟1000个用户在线,后5分钟100个用户在线的场景。读者可根据测试需要修改main.js文件。


因为默认CDK模版预置的RDS Aurora mysql实例和Elasticahe Redis cluster规模过小,不适合用来做测试。这里修改CDK代码cdk/lib/woocommerce-stack.ts,将RDS Aurora mysql 的r5.4xlarge。Elasticahe Redis cluster修改为r5.xlarge。客户也可以自行改大规模进行更大范围的测试。



通过以下命令更新资源。

make diff
make deploy


在这里我们使用一台c5.xlarge的Amazon Linux 2 EC2来进行测试。并安装CloudWatch Agent,将k6生成的指标上传到CloudWatch进行可视化。注意EC2需要有权写入CloudWatch Metrics,这里我们使用EC2 Role来赋予权限。


通过创建Role,选择下图的托管策略CloudWatchAgentAdminPolicy,并且把这个Role绑定给EC2。



通过以下命令安装、配置k6和CloudWatch Agent,并运行k6进行测试。


sudo yum -y install https://dl.k6.io/rpm/repo.rpm
sudo yum -y install --nogpgcheck k6
sudo yum -y install git 
git clone https://github.com/aws-samples/serverless-woocommerce-workshop.git
cd ~/serverless-woocommerce-workshop/test/k6
sudo yum install -y amazon-cloudwatch-agent
cat << EOF > cw-statsd.json
{
    "metrics": {
        "namespace""k6",
        "metrics_collected": {
            "statsd": {
                "service_address"":8125",
                "metrics_collection_interval"1,
                "metrics_aggregation_interval"0
            }
        }
    }
}
EOF
sudo amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:./cw-statsd.json
K6_STATSD_ENABLE_TAGS=true k6 run --out statsd -e HOSTNAME= main.js

*左滑查看更多


下图是k6测试运行完的统计结果。



在CloudWatch的k6 metrics中能看到每秒完成的订单数和Lambda的并发量。可以看出,随着随着请求/订单量的增加,Lambda会自动进行扩展。可以看出,Lambda能够应对对于流量的高低峰,无需任何运行操作。



附录


基于亚马逊云科技无服务器服务快速搭建电商平台——部署篇


无服务器独立站工作坊:

https://catalog.workshops.aws/serverless-woocommerce/zh-CN


Github code:

https://github.com/aws-samples/serverless-woocommerce-workshop


总结


本篇博客在上一篇的基础上,介绍了Serverless建站方案的优势,并对基于Serverless服务的WordPress进行负载测试,能够看出Amazon Lambda能够自动应对流量高低峰而无需任何运维操作,大大节省运维成本。读者也可以根据自身需求,修改测试脚本,进行更大规模的性能测试。



本篇作者




汪其香

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,同时热衷于深度学习的研究与应用。


许昌月

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构咨询和设计,实施和推广,擅长软件开发,具有丰富的解决客户实际问题的经验。


听说,点完下面4个按钮

就不会碰到bug了!



推荐阅读
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 刷题笔记:探索乘积小于K的子数组问题 ... [详细]
author-avatar
手机用户2602930391
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有