热门标签 | 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了!



推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
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社区 版权所有