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

2023-10-31

使用 Serverless 构建独立站的优势

在传统架构模式下,如果需要进行电商大促需要提前预置计算资源以支撑高并发访问,会造成计算资源浪费并且增加运维工作量。本文介绍一种新的部署方式,将 WordPress 和 WooCommerce 部署在 Amazon Lambda 中。Lambda 是无服务器的计算方式,无需预置资源就可以运行代码,自动响应任何规模的代码执行请求,从每天十几个事件到每秒数十万个事件,按计算时间付费(以毫秒为单位),真正做到按使用量计费,从而达到节省预置资源和运维成本。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 运行。Amazon 提供了一组可用于创建容器映像的开源基础映像。这些基本映像包括runtime interface clients 。Lambda 映像是只读的,但函数代码可以访问具有 512 MB 存储空间的可写 /tmp 目录。本方案使用 Docker 来创建映像。Dockerfile 里使用 Amazon 提供的基础映像Amazon Linux 2,并使用 bedrock 来管理 WordPress 和插件的安装。本方案中预配置了一些必要插件,客户可以修改 bedrock 的配置添加所需要的插件。

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,访问此 [Repo] (https://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。客户也可以自行改大规模进行更大范围的测试。

image.png

通过以下命令更新资源。

make diff
make deploy

在这里我们使用一台 c5.xlarge 的 Amazon Linux 2 EC2来进行测试。并安装 CloudWatch Agent,将 k6生成的指标上传到 CloudWatch 进行可视化。注意 EC2需要有权写入 CloudWatch Metrics,这里我们使用 EC2 Role 来赋予权限。通过创建 Role,选择下图的托管策略 CloudWatchAgentAdminPolicy,并且把这个 Role 绑定给EC2。

image.png

通过以下命令安装、配置 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=<your WooCommerce website domain name> main.js

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

image.png

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

image.png

总结

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

附录

本篇作者

image.png

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

image.png

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

文章来源:https://dev.amazoncloud.cn/column/article/630b30932ecbae73705ffb63?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 服务器性能pdf,服务器性能计算方法.pdf

    一 数据库服务器性能计算需求分析 考虑到广州市公安局超级情报系统 SIS 设备升级项目的数据库 服务器的性能 我们建议采用主流的 T PC C值进行性能估算 TPC C 是一种旨在衡量联机事务处理 OLTP 系统性能与可 伸缩 性的行业标准
  • gcc make编译android,是用cmake编译openssl(支持android)

    openssl 首先openssl的源码 方案 这里用到了janbar的方案 且作者一直在更新 基本直接可以编译 设置到的主要的cmake文件 CMakeLists txt c rehash cmake crypto CMakeLists
  • Excel获取数值

    Excel获取数值篇 修复Cell getCellType方法过时问题 使用最新的类型方式获取 根据Excel单元格类型返回相对应的值 根据Excel单元格类型返回相对应的值 param cell return public static

随机推荐

  • NLP七十年!斯坦福教授Manning长文梳理

    作者 LRS 来源 新智元 从手工规则 神经网络到Transformer基础模型 自然语言处理的未来是统一多模态 走向通用人工智能 过去十年间 仅靠简单的神经网络计算 以及大规模的训练数据支持 自然语言处理领域取得了相当大的突破 由此训练得
  • vmware14 安装windows 11 注意事项

    1 正常创建虚拟机 系统选择window 10 x64 2 修改启动方式为UEFI 虚拟机设置 选项 高级 3 修改虚拟机配置 启用加密 虚拟机设置 选项 访问控制 启用加密 4 接下来正常安装即可 系统从微软官网下载
  • JedisPool链接未释放

    最近线上出现一个问题 一个接口一段时间后无响应 查看nginx日志499 502异常 zpp trade recharftenunt v1 qury HTTP 1 1 499 zpp trade recharftenunt v1 qury
  • 猫眼家APP广告变现:数据埋点在广告变现中的重要作用

    前言 数据埋点技术是一种收集用户行为数据并生成大量数据的方法 当用户在应用程序中执行操作时 代码会捕获并记录该操作 从而实现数据埋点 数据埋点对于实施APP广告变现策略至关重要 开发人员需要准确了解用户的行为习惯 兴趣和偏好 以提高广告变现
  • 基于Qt4+SQLite3的通信录

    首先申明 本文借鉴于 http blog csdn net jianchi88 article details 7052270 通信录实现的动能有 添加 查找 删除 但在页面效果上还不太美观 功能上没有去验证输入的信息的有效性 运行环境 u
  • 【FPGA零基础学习之旅#8】阻塞赋值与非阻塞赋值讲解

    欢迎来到FPGA专栏 阻塞赋值与非阻塞赋值 o o 嗨 我是小夏与酒 博客主页 小夏与酒的博客 该系列文章专栏 FPGA学习之旅 文章作者技术和水平有限 如果文中出现错误 希望大家能指正 欢迎大家关注 目录 阻塞赋值与非阻塞赋值 一 基础知
  • OceanBase 3.1.2版本测试报告

    测试场景 OLTP场景 测试工具使用的是开源版本BenchmarkSQL5 0 说明 我们已经通过修改源代码 实现了MySQL的支持 在单位进行分布式数据库POC选型时 都是使用该版本 集群拓扑及硬件配置信息 7台物理机 使用OBD直接部署
  • MySQL 中not in 查询为空

    MySQL not in踩坑 今天想用not in进行嵌套查询时 从逻辑上本应返回数据的结果却没有返回任何数据 查阅资料后找到原因 not in中 不能包含null值 如果包含null值 则直接返回空结果集 上代码
  • 计算二进制位"1"的个数

    写一个函数 返回数字中二进制位为 1 的个数 比如36 化为二进制得到100100 其中有2个 1 方法1 分别判断各个位 int bit count unsigned int n int count for count 0 n n gt
  • 最优服务次序问题(贪心法)

    最优服务次序问题 贪心法 问题描述 设有n个顾客同时等待一项服务 顾客i所需要的服务时间为ti 应如何安排顾客的服务次序 才能使平均等待时间最短 平均等待时间是n个顾客等待服务时间的总和除以n 解题思路 1 算法主要思想 本题我们直接采用贪
  • 【小白学习日记】如何使用matlab实现多矩阵排列组合

    matlab实现穷举法 今天在写程序时 需要实现一个穷举 即现有一个1 8的矩阵 第一个元素有四个值 第二到七个元素分别从0 1 1里面取值 要列出所有情况 即有8748种情况 在论坛上遇到一位提出利用ndgrid函数即可解决上述问题 原文
  • python关于字符串下面说法错误的是_Python计算机等级考试中易出错概念问题6(附答案),稳基,修炼,之,易错,含答案...

    1 关于Python对文件的处理 以下选项中描述错误的是 A Python能够以文本和二进制两种方式处理文件 B Python通过解释器内置的open 函数打开一个文件 C 当文件以文本方式打开时 读写按照字节流方式 D 文件使用结束后要用
  • Spring Boot静态资源访问和配置全解析

    一 默认静态资源映射规则 二 自定义静态资源映射规则 2 1 自定义静态资源映射类 2 2 在application properties中进行配置 2 2 1 配置静态资源访问路径 2 2 2 配置静态资源目录 原文 在web开发中 静态
  • 笔试真题之判断一个数字是否是素数(算法详解及python实现)

    题 explain 判断一个数字是否是素数 input 数字n output 如果是素数返回True 否则返回False 示例 判断112272535095293是否是素数 算法思想 首先判断是不是1或2 1不是素数 2是素数 其次判断是不
  • ts文件运行环境搭建和运行步骤

    1 全局安装 TypeScript 语言的编译器 window r gt cmd gt 命令提示行 下输入npm i g typescript 只需首次安装即可 2 在vscode的终端里先运行tsc init tsc是ts语言的编译器 如
  • C++初步

    定义一个命名空间Myspace 包含以下函数 将一个字符串中的所有单词进行反转 并输出反转后的结果 例如 输入字符串为 Hello World 输出结果为 olleH dlroW 并在主函数内测试该函数 include
  • node-sass安装失败番外篇

    node sass安装失败番外篇 工作 环境 错误现象 原因 总结 工作 环境 win10 npm 使用淘宝镜像源 错误现象 报错信息如下 我在不同电脑的不同 编辑器 webstom vscdoe cmd git bash 下显示的错误不太
  • MySQL学习总结--WAL日志

    MySQL学习总结 WAL日志 WAL redo log VS binlog 日志的两阶段提交 组提交机制 group commit redo log 重做日志 binlog 归档日志 binlog 的三种格式对比 WAL 导致了内存脏页
  • JS中用window.open()方式打开,使新页面全屏、居中的代码

    window open 的介绍 1 基本语法 window open pageURL name parameters 2 各项参数 其中yes no也可使用1 0 pixel value为具体的数值 单位象素 参数 取值范围 说明 alwa
  • 基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇

    使用 Serverless 构建独立站的优势 在传统架构模式下 如果需要进行电商大促需要提前预置计算资源以支撑高并发访问 会造成计算资源浪费并且增加运维工作量 本文介绍一种新的部署方式 将 WordPress 和 WooCommerce 部