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

0
0
{"value":"#### **使用 Serverless 构建独立站的优势**\n\n\n在传统架构模式下,如果需要进行电商大促需要提前预置计算资源以支撑高并发访问,会造成计算资源浪费并且增加运维工作量。本文介绍一种新的部署方式,将 WordPress 和 WooCommerce 部署在 Amazon Lambda 中。Lambda 是无服务器的计算方式,无需预置资源就可以运行代码,自动响应任何规模的代码执行请求,从每天十几个事件到每秒数十万个事件,按计算时间付费(以毫秒为单位),真正做到按使用量计费,从而达到节省预置资源和运维成本。Lambda 的这种特性,让 Lambda 越来越受欢迎,越来越多的客户选择 Lambda 来部署应用,其中也包含 web 应用。了解 Lambda 的客户可能清楚,Lambda 是基于事件触发的方式,对于 web 应用,需要使用 API Gateway,接收 HTTP 请求,把 HTTP 请求转化为 Lambda 事件触发 Lambda 运行。\n\n在以前,对于已有的 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。\n\n本文着重介绍 Lambda container image 和 Lambda Function URL,关于 Lambda Adapter 的实现细节请参考这篇博客。\n\n\n##### **Lambda container image**\n\n\n要将容器运行在 Lamabda,容器映像需包含运行时 API 的 [runtime interface clients](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html#runtimes-api-client),用于管理 Lambda 和函数代码之间的交互。客户可以自行将 runtime interface client 包含在自己的映像以支持在 Lambda 运行。Amazon 提供了一组可用于创建容器映像的开源[基础映像](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 映像是只读的,但函数代码可以访问具有 512 MB 存储空间的可写 /tmp 目录。本方案使用 Docker 来创建映像。Dockerfile 里使用 Amazon 提供的基础映像Amazon Linux 2,并使用 bedrock 来管理 WordPress 和插件的安装。本方案中预配置了一些必要插件,客户可以修改 bedrock 的配置添加所需要的插件。\n\n\n##### **Lambda Function URL**\n\n\n现在可以通过创建 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 的费用。\n\n\n#### **负载测试**\n\n\n在上一篇博客的基础上,我们使用 WordPress 的插件 Blocksy 快速构建一个 Starter Site,并使用这个 Site 来作为测试对象。\n\n本方案已经开源在 Github,访问此 [Repo] (https://github.com/aws-samples/serverless-WooCommerce-workshop)可获得完整代码。\n\n在 test/k6文件夹内,本方案也提供了进行性能测试的 k6脚本。模拟了用户进入主页,选择商品,并加入购物车,更新地址,到提交订单的完整流程。具体说明参考 test/readme.md 文件。\n\nmain.js 作为测试的入口文件,模拟了前5分钟100个用户在线,中间10分钟1000个用户在线,后5分钟100个用户在线的场景。读者可根据测试需要修改 main.js 文件。\n\n因为默认 CDK 模版预置的 RDS Aurora mysql 实例和 Elasticahe Redis cluster 规模过小,不适合用来做测试。这里修改 CDK 代码cdk/lib/woocommerce-stack.ts,将 RDS Aurora mysql 的 r5.4xlarge。Elasticahe Redis cluster 修改为 r5.xlarge。客户也可以自行改大规模进行更大范围的测试。\n\n![image.png](https://dev-media.amazoncloud.cn/479bb8be6cdc4e7b9c94c6298952734c_image.png)\n\n通过以下命令更新资源。\n\n```\nmake diff\nmake deploy\n```\n\n在这里我们使用一台 c5.xlarge 的 Amazon Linux 2 EC2来进行测试。并安装 CloudWatch Agent,将 k6生成的指标上传到 CloudWatch 进行可视化。注意 EC2需要有权写入 CloudWatch Metrics,这里我们使用 EC2 Role 来赋予权限。通过创建 Role,选择下图的托管策略 CloudWatchAgentAdminPolicy,并且把这个 Role 绑定给EC2。\n\n![image.png](https://dev-media.amazoncloud.cn/4981736a79454c8d88f027121c681fe5_image.png)\n\n通过以下命令安装、配置 k6和 CloudWatch Agent,并运行 k6进行测试。\n\n```\nsudo yum -y install https://dl.k6.io/rpm/repo.rpm\nsudo yum -y install --nogpgcheck k6\nsudo yum -y install git \ngit clone https://github.com/aws-samples/serverless-woocommerce-workshop.git\ncd ~/serverless-woocommerce-workshop/test/k6\nsudo yum install -y amazon-cloudwatch-agent\ncat << EOF > cw-statsd.json\n{\n \"metrics\": {\n \"namespace\": \"k6\",\n \"metrics_collected\": {\n \"statsd\": {\n \"service_address\": \":8125\",\n \"metrics_collection_interval\": 1,\n \"metrics_aggregation_interval\": 0\n }\n }\n }\n}\nEOF\nsudo amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:./cw-statsd.json\nK6_STATSD_ENABLE_TAGS=true k6 run --out statsd -e HOSTNAME=<your WooCommerce website domain name> main.js\n```\n\n下图是 k6测试运行完的统计结果。\n\n![image.png](https://dev-media.amazoncloud.cn/662fa2fc9e5047908b69289b2e30540b_image.png)\n\n在 CloudWatch 的 k6 metrics 中能看到每秒完成的订单数和 Lambda 的并发量。可以看出,随着随着请求/订单量的增加,Lambda 会自动进行扩展。可以看出,Lambda 能够应对对于流量的高低峰,无需任何运行操作。\n\n![image.png](https://dev-media.amazoncloud.cn/f3bd1dc60eec428e99947314ef5a799d_image.png)\n\n\n#### **总结**\n\n\n本篇博客在上一篇的基础上,介绍了 Serverless 建站方案的优势,并对基于 Serverless 服务的 WordPress 进行负载测试,能够看出 Lambda 能够自动应对流量高低峰而无需任何运维操作,大大节省运维成本。读者也可以根据自身需求,修改测试脚本,进行更大规模的性能测试。\n\n\n#### **附录**\n\n- [基于亚马逊云科技无服务器服务快速搭建电商平台——部署篇](https://aws.amazon.com/cn/blogs/china/quickly-build-e-commerce-platform-based-on-aws-server-less-deployment/)\n- 无服务器独立站工作坊:[https://catalog.workshops.aws/serverless-woocommerce/zh-CN](https://catalog.workshops.aws/serverless-woocommerce/zh-CN)\n- Github code:[https://github.com/aws-samples/serverless-woocommerce-workshop](https://github.com/aws-samples/serverless-woocommerce-workshop)\n\n\n\n#### **本篇作者**\n\n\n![image.png](https://dev-media.amazoncloud.cn/a6a623638b4c4d14b7df4e9508ca5867_image.png)\n\n**汪其香**\nAmazon 解决方案架构师,负责基于 Amazon 云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,同时热衷于深度学习的研究与应用。\n\n![image.png](https://dev-media.amazoncloud.cn/8327b78c521848049ae52c11fda26bf6_image.png)\n\n**许昌月**\nAmazon 解决方案架构师,负责基于 Amazon 的云计算方案架构咨询和设计,实施和推广,擅长软件开发,具有丰富的解决客户实际问题的经验。","render":"<h4><a id=\"_Serverless__0\"></a><strong>使用 Serverless 构建独立站的优势</strong></h4>\n<p>在传统架构模式下,如果需要进行电商大促需要提前预置计算资源以支撑高并发访问,会造成计算资源浪费并且增加运维工作量。本文介绍一种新的部署方式,将 WordPress 和 WooCommerce 部署在 Amazon Lambda 中。Lambda 是无服务器的计算方式,无需预置资源就可以运行代码,自动响应任何规模的代码执行请求,从每天十几个事件到每秒数十万个事件,按计算时间付费(以毫秒为单位),真正做到按使用量计费,从而达到节省预置资源和运维成本。Lambda 的这种特性,让 Lambda 越来越受欢迎,越来越多的客户选择 Lambda 来部署应用,其中也包含 web 应用。了解 Lambda 的客户可能清楚,Lambda 是基于事件触发的方式,对于 web 应用,需要使用 API Gateway,接收 HTTP 请求,把 HTTP 请求转化为 Lambda 事件触发 Lambda 运行。</p>\n<p>在以前,对于已有的 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。</p>\n<p>本文着重介绍 Lambda container image 和 Lambda Function URL,关于 Lambda Adapter 的实现细节请参考这篇博客。</p>\n<h5><a id=\"Lambda_container_image_10\"></a><strong>Lambda container image</strong></h5>\n<p>要将容器运行在 Lamabda,容器映像需包含运行时 API 的 <a href=\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html#runtimes-api-client\" target=\"_blank\">runtime interface clients</a>,用于管理 Lambda 和函数代码之间的交互。客户可以自行将 runtime interface client 包含在自己的映像以支持在 Lambda 运行。Amazon 提供了一组可用于创建容器映像的开源<a href=\"https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/runtimes-images.html#runtimes-images-lp\" target=\"_blank\">基础映像</a>。这些基本映像包括<a href=\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html#runtimes-api-client\" target=\"_blank\">runtime interface clients</a> 。Lambda 映像是只读的,但函数代码可以访问具有 512 MB 存储空间的可写 /tmp 目录。本方案使用 Docker 来创建映像。Dockerfile 里使用 Amazon 提供的基础映像Amazon Linux 2,并使用 bedrock 来管理 WordPress 和插件的安装。本方案中预配置了一些必要插件,客户可以修改 bedrock 的配置添加所需要的插件。</p>\n<h5><a id=\"Lambda_Function_URL_16\"></a><strong>Lambda Function URL</strong></h5>\n<p>现在可以通过创建 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 的费用。</p>\n<h4><a id=\"_22\"></a><strong>负载测试</strong></h4>\n<p>在上一篇博客的基础上,我们使用 WordPress 的插件 Blocksy 快速构建一个 Starter Site,并使用这个 Site 来作为测试对象。</p>\n<p>本方案已经开源在 Github,访问此 [Repo] (https://github.com/aws-samples/serverless-WooCommerce-workshop)可获得完整代码。</p>\n<p>在 test/k6文件夹内,本方案也提供了进行性能测试的 k6脚本。模拟了用户进入主页,选择商品,并加入购物车,更新地址,到提交订单的完整流程。具体说明参考 test/readme.md 文件。</p>\n<p>main.js 作为测试的入口文件,模拟了前5分钟100个用户在线,中间10分钟1000个用户在线,后5分钟100个用户在线的场景。读者可根据测试需要修改 main.js 文件。</p>\n<p>因为默认 CDK 模版预置的 RDS Aurora mysql 实例和 Elasticahe Redis cluster 规模过小,不适合用来做测试。这里修改 CDK 代码cdk/lib/woocommerce-stack.ts,将 RDS Aurora mysql 的 r5.4xlarge。Elasticahe Redis cluster 修改为 r5.xlarge。客户也可以自行改大规模进行更大范围的测试。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/479bb8be6cdc4e7b9c94c6298952734c_image.png\" alt=\"image.png\" /></p>\n<p>通过以下命令更新资源。</p>\n<pre><code class=\"lang-\">make diff\nmake deploy\n</code></pre>\n<p>在这里我们使用一台 c5.xlarge 的 Amazon Linux 2 EC2来进行测试。并安装 CloudWatch Agent,将 k6生成的指标上传到 CloudWatch 进行可视化。注意 EC2需要有权写入 CloudWatch Metrics,这里我们使用 EC2 Role 来赋予权限。通过创建 Role,选择下图的托管策略 CloudWatchAgentAdminPolicy,并且把这个 Role 绑定给EC2。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/4981736a79454c8d88f027121c681fe5_image.png\" alt=\"image.png\" /></p>\n<p>通过以下命令安装、配置 k6和 CloudWatch Agent,并运行 k6进行测试。</p>\n<pre><code class=\"lang-\">sudo yum -y install https://dl.k6.io/rpm/repo.rpm\nsudo yum -y install --nogpgcheck k6\nsudo yum -y install git \ngit clone https://github.com/aws-samples/serverless-woocommerce-workshop.git\ncd ~/serverless-woocommerce-workshop/test/k6\nsudo yum install -y amazon-cloudwatch-agent\ncat &lt;&lt; EOF &gt; cw-statsd.json\n{\n &quot;metrics&quot;: {\n &quot;namespace&quot;: &quot;k6&quot;,\n &quot;metrics_collected&quot;: {\n &quot;statsd&quot;: {\n &quot;service_address&quot;: &quot;:8125&quot;,\n &quot;metrics_collection_interval&quot;: 1,\n &quot;metrics_aggregation_interval&quot;: 0\n }\n }\n }\n}\nEOF\nsudo amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:./cw-statsd.json\nK6_STATSD_ENABLE_TAGS=true k6 run --out statsd -e HOSTNAME=&lt;your WooCommerce website domain name&gt; main.js\n</code></pre>\n<p>下图是 k6测试运行完的统计结果。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/662fa2fc9e5047908b69289b2e30540b_image.png\" alt=\"image.png\" /></p>\n<p>在 CloudWatch 的 k6 metrics 中能看到每秒完成的订单数和 Lambda 的并发量。可以看出,随着随着请求/订单量的增加,Lambda 会自动进行扩展。可以看出,Lambda 能够应对对于流量的高低峰,无需任何运行操作。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/f3bd1dc60eec428e99947314ef5a799d_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_84\"></a><strong>总结</strong></h4>\n<p>本篇博客在上一篇的基础上,介绍了 Serverless 建站方案的优势,并对基于 Serverless 服务的 WordPress 进行负载测试,能够看出 Lambda 能够自动应对流量高低峰而无需任何运维操作,大大节省运维成本。读者也可以根据自身需求,修改测试脚本,进行更大规模的性能测试。</p>\n<h4><a id=\"_90\"></a><strong>附录</strong></h4>\n<ul>\n<li><a href=\"https://aws.amazon.com/cn/blogs/china/quickly-build-e-commerce-platform-based-on-aws-server-less-deployment/\" target=\"_blank\">基于亚马逊云科技无服务器服务快速搭建电商平台——部署篇</a></li>\n<li>无服务器独立站工作坊:<a href=\"https://catalog.workshops.aws/serverless-woocommerce/zh-CN\" target=\"_blank\">https://catalog.workshops.aws/serverless-woocommerce/zh-CN</a></li>\n<li>Github code:<a href=\"https://github.com/aws-samples/serverless-woocommerce-workshop\" target=\"_blank\">https://github.com/aws-samples/serverless-woocommerce-workshop</a></li>\n</ul>\n<h4><a id=\"_98\"></a><strong>本篇作者</strong></h4>\n<p><img src=\"https://dev-media.amazoncloud.cn/a6a623638b4c4d14b7df4e9508ca5867_image.png\" alt=\"image.png\" /></p>\n<p><strong>汪其香</strong><br />\nAmazon 解决方案架构师,负责基于 Amazon 云计算方案的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,同时热衷于深度学习的研究与应用。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/8327b78c521848049ae52c11fda26bf6_image.png\" alt=\"image.png\" /></p>\n<p><strong>许昌月</strong><br />\nAmazon 解决方案架构师,负责基于 Amazon 的云计算方案架构咨询和设计,实施和推广,擅长软件开发,具有丰富的解决客户实际问题的经验。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭
contact-us