构建第一个事件驱动型 Serverless 应用
我相信,我们从不缺精彩的应用创意,我们缺少的把这些想法变成现实的时间和付出。
我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。
在我 20 多年 IT 从业经历中,一直专注于 IT 基础架构的设计和搭建,并没有很多编程的经验。入职亚马逊云科技之后,我成为一名开发者布道师,为了了解和传播亚马逊云科技的无服务器技术,我做了一系列“这就是无服务器”的学习视频。我想仅仅了解技术的功能和特性是不够的,我还应该掌握如何利用无服务器技术,编译和运行代码来构建我的应用。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点 这里让它成为你的技术宝库!
你可能是和我一样,对编码比较陌生,只是在寻找一种方法来建立我们心中的应用程序。或者,你可能是一个有很多编码经验的人,但仅限于在服务器或容器上运行过应用程序,现在希望探索无服务器。无论你带着哪种目的关注这篇,我都希望以下的内容带你了解我的无服务器学习之旅,了解我如何从对无服务器一无所知到建立自己的应用程序。
项目背景
因为我所在的团队是一个分布在全球的组织。对于实现有效的沟通,语言是个重要工具。我在学习英文的同时,我的“歪果仁”同事也在学习中文。我们互为对方的语言老师。在学习的过程中,我发现中文的学习看起来要比英文学习更为困难。为了让我的同事跟上我的进度,我有了为他构建一个中文学习 app 的有趣想法。
首先这个应用程序要提供交付中文单词学习的日提醒服务。我想这个 app 设计逻辑应该是从一个词汇数据库里按照设定好的时间和规则拉出一个词,并通过邮件或者文本的方式发送给用户。
然而,我只是有一些 Python 和 JavaScript 简单的 coding 经验,但是我还是希望把这个 app 做成一个能真正被使用的语言学习 app:
- 它能够持续维护并可以扩展新功能;
- 作为一个运行在云端的真正的应用,我希望它的成本不要太高;
- 由于目前仅有一个运维工程师(就是本人)的 app,我希望它的运营和维护工作量也不要太大,而且最好它还能根据访问情况,自动的扩缩容(这个很重要)。
构建平台和服务的选择
对于这个应用,我选择无服务器服务和架构。
所谓的无服务器不是指没有服务器,代码的编译和运行还是需要服务器的计算资源,只是无论是代码编译还是运行,都不用配置和管理服务器。
举个例子,以前我们运行一个应用或者构建一个 web 网站,首先需要对服务器进行配置,包括系统安装,补丁以及更新。同时还需要容量的预估和分配。为业务高峰预留的资源大部分时间闲置,但是仍需付费。除此之外在整个应用的生命周期中,服务器的管理和运维也会花费很多时间。总而言之,除了应用构建本身,还需要大量的时间和资源花在服务器的管理上。
做为亚马逊云科技的构建者,我将这个应用部署在亚马逊云科技的云平台上并选用 Amazon Lambda,做为计算服务,通过 lambda 函数,运行任何类型的代码,我只需要把一段代码放进函数。同时由于它是事件驱动的,对于这个应用,日历做为事件来触发 lambda 函数运行代码。所有服务器相关的配置和管理工作由亚马逊云科技提供,而我只需要专注于应用本身,只需要专注于代码编译和运行。同时无服务器的技术特点就包括了自动扩缩容、按需付费,不用考虑底层计算资源的配置和预留,等等。
接下来,我需要 API 让应用的前端和后端进行交互,同时我选择 Amazon S3 和 Amazon DynamoDB 做为应用数据的存储。应用程序之间需要不同类型的粘合剂,因此我用到来亚马逊云科技提供其他无服务器架构的集成服务,包括:
- SQS 帮我创建消息队列;
- 使用 Amazon SNS 发送文本信息或电子邮件;
- Amazon EventBridge 通过设置一个按每天或每周的节奏运行的事件,来触发 lambda 函数;
- Amazon Step Functions 用来构建工作流;
- ...
我还需要托管我们静态内容的服务,比如 HTML 以及前端的相关内容,我选择了 Amazon Amplify。考虑到如果有用户需要登录这个网站或进行某种身份验证,因此我有用了 Amazon Cognito 来实现身份验证。
所有的这些服务协同工作,彼此深度集成,帮助我快速的构建应用。
开发工具和应用架构的选择
在设计开发这个应用程序的一开始,我花了很多时间在 testfunction console 和这个可爱的按钮上,因为它允许我当场测试我的函数代码的可行性。
如果你只是想学习一下 lambda,感受它是怎么工作的,测试你写的一小段代码是否正常工作,console 绝对是个好地方。你直观的看到代码执行过程中具体发生了什么。这是一种很好的方式去学习和理解 lambda 函数。
如果你只是想单纯的学习和测试一下函数,只是看看它们的样子,以及它们是如何工作的,使用 testfunction console 就可以了。
但是如果你想构建一个便于更改的应用程序,同时可以支持迭代更新,并且可以通过模版进行部署”,那我建议您选择 “serverless infrastructure as code” 做为开发框架。
这意味着可以将整个应用程序都用代码定义,将所有变更都保存下来,对于开发过程中,需要回滚到应用程序的先前版本,或者确保每次都以正确的方式进行配置的要求,IaC 是非常有帮助。
对于 IaC 的开发框架,开发者们有很多选择,包括亚马逊云科技开源的 SAM(serverless application model),Serverless Framework,以及 Amazon Cloud development Kit or Amazon CDK。
我个人比较推荐使用 Amazon SAM。在这个中文学习 app 的构建中我使用了 Amazon SAM。原因是它对初学者很友好。
这是一段 SAM template,使用的 Python 3.8 运行:
如果你和我一样,也在亚马逊云科技云平台上构建应用,相信你一定用 IAM policy 对不同服务之间的调用进行过身份验证。那么你一定对很多很多行代码才能实现的过程印象深刻。而在这段 SAM policy template,SNS published message policy,仅仅需要两行代码。最后通过创建 “DailyEventBridgeEvent” 事件来触发 lambda 函数,就完成了。
使用 SAM 部署 serverless 应用,是不是真的很简单,容易上手?
对于 serverless 架构的应用来说,它可以自动获得云上的资源。因此我们需要常常面对资源的变化带来的部署问题。建议的方式是设置自动部署 pipeline。只要用一种非常简单的自动化方式来将代码添加到资源库,很快就能看到它们在云端上线,这是一种非常美好的感受。对于设置自动部署 pipeline,实现 CI/CD,有很多的工具和方式可以选择,比如 CircleCI,GitHub 以及亚马逊云科技提供的 Amazon CodePipeline。
无服务器应用构建
1. 消息发送
使用 Amazon EventBridge 来计划每日事件。Amazon EventBridge 将触发 lambda 函数,通过运行代码从 S3 存储桶中提取单词并随机选择一个做为今天的学习词汇。然后由 Amazon SNS 将这个随机选取的单词用短信的方式发送到手机端。基于这个架构的 lambda 函数代码示例。
import json import boto3 s3_client = boto3.client('s3') sns_client = boto3.client('sns') def lambda_handler(event, context): # Call S3 to retrieve today's vocabulary word message = “Today’s word is ” + wordtry: response = sns_client.publish( TargetArn='arn:aws:sns:us-east-1:1234567890:App', Message=json.dumps({'default': json.dumps(message)}), MessageStructure='json' ) except Exception as e: print(f"Failed to send text message. Error: {e}")
实现每提取一个词汇,生成一条消息,然后调用 SNS 将该消息发布到目标 ARN。在这里我将消息发布到我的一个同事的手机端,因此我只需要把 Target ARN 定义成他的手机号码,他就可以每天收到中文词汇的学习信息了。
2. 订阅模式的扩展
随着更多同事对这个中文学习的 app 感兴趣,我发现手动添加手机号码和功能管理就成了麻烦事儿。所以我决定再做一个订阅网站,通过用户界面让他们自己订阅或者退订。
如同所示,我做了小的调整:
为了节省成本,将中文词汇用 email 的方式发送客户端,替换掉之间短信发送的方式。然后用 Amazon Amplify 托管静态网页的内容,比如一些 HTML 和 CSS 的前端显示。使用 API Gateway 来连接 lambda 函数。当用户想要订阅或者退订服务的时候,API 就会触发函数执行操作,在 Dynamo DB 数据库中进行相关数据的更新。
这就是中文学习应用的用户界面,有限的 JavaScript 的能力就只能做到这里了。不过这个应用支持订阅,还可以根据不同的级别接受相关中文词汇学习信息的定期邮件发送。
3. 规划数据库访问模式
在应用开始的模型中,我仅用了 S3 服务存储一个 CSV 文件,其中包含所有词汇表。但有了更多用户并更改为订阅模式后,我决定用更结构化数据管理方式来升级应用程序的存储配置。
于是我选择 DynamoDB,因为他具有 serverless 属性,比如按用量付费、使用 IAM 对他进行身份验证,通过 API 调用来实现和其他服务之间的交互等。因此我就不会遇到传统数据库服务的一些限制,比如指定的是时间内连接数的限制。同时,用 Amazon Web Services lambda 与之搭配。这样在面对 lambda 的弹性扩展,数据库的调用才不会成为瓶颈。
但 DynamoDB 也是一种 No SQL 的非关系型数据库,这和运行在单实例上完整的数据库不同,当向 DynamoDB 添加数据时,它会自动对该数据进行分片或分解成块,并将其放在不同的服务器上。我想确保我最常提取的数据被组合在一起,因此我规划了数据库访问模式,将最常被拉取的数据分组在一起。
4. 丰富用户登陆功能
我还希望这个中文学习 app 能够有更多功能来优化一下用户的登录体验。比如用户最好能够通过输入用户名和密码验证登录。另外订阅用户能够配置自己个性化的信息。甚至我还想让用户在这个 app 中设置词汇测试...
于是对于这个应用,我继续改进。
我向后端添加了用户身份验证和用户配置文件,添加了两个新的 lambda 函数和两个新的 API 端点。一个获取用户数据,一个更新用户数据。这两者都需要数据保护服务。因此他们还需要调用 Cognito 来进行身份验证,验证通过才能访问和获取数据。具体的架构就变成了这样:
改造后用户交互界面就变成了这个样子:
一个中文学习 app 就基本完成了,这是我的一个事件驱动型的 serverless 应用:实现了云资源的自动扩所容,基本不需要太花精力在底层资源的运维。在云上的构建和运行成本也是可以承受的。
我大致做了一个估算,成本分析如下:
用户规模如果达到 100+ 的活跃订阅者,每个月会产生 4500 API Gateway requests,4800 Lambda invokes,10000 Amazon CloudFront requests 以及 32000 Amazon S3 requests,那么每月应用运行的总支出不超过 1 美金。这是真的。
开始你的第一个事件驱动型 serverless 应用
如同开始所提到的,事件驱动型无服务器应用具有完全托管、无状态、事件驱动、自动扩展、轻量低成本、弹性高可用、以及无需运维等特点。这使其非常适合处理短暂、高并发和容易扩展的工作流,能够大幅提高资源利用率并降低应用成本。因此,它正逐渐演进为构建云原生应用的主流架构与方式。也成为云上构建者首选的技术和应用架构。
当你打开亚马逊云科技的官方主页,搜索并了解亚马逊云科技提供的所有 serverless 服务时,你会发现,这是一个大家族,从计算,到存储,再到数据库和信息集成,还有最新的数据分析服务。亚马逊云科技提供了全栈式的 serverless 服务。
希望亚马逊云科技提供的无服务器服务和开发框架以及我的开发经历可以帮助到你开始你的第一个事件驱动型的 serverless 应用。
请持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!
往期推荐
#Generative AI 新世界
#开发者生态
#亚马逊实践
文章来源:
https://dev.amazoncloud.cn/column/article/6482a9e94a40447dcdc0d7bf?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN
相关文章:
构建第一个事件驱动型 Serverless 应用
我相信,我们从不缺精彩的应用创意,我们缺少的把这些想法变成现实的时间和付出。 我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。 在我 2…...
特征与特征图的区别
1.特征图是什么? 特征图是指在卷积神经网络中,通过卷积操作从输入图像中提取出来的图像特征。在卷积神经网络中,每一层的输出都是一个三维张量,其中第三维表示特征图的数量。每个特征图都是由若干个卷积核对上一层的特征图进行卷…...
Linux学习笔记之七(shell脚本的基本语法)
Shell 1、Shell脚本2、常用运算符2、特殊语法4、关于变量的一些命令4.1、echo4.2、export4.3、read4.4、declare/typeset4.5、local4.6、unset 5、基本逻辑语法5.1、if判断5.2、for循环5.3、while循环5.4、case语句 6、函数定义7、多脚本链接 1、Shell脚本 学习shell脚本开发之…...
PySpark开发环境搭建常见问题及解决
PySpark环境搭建常见问题及解决 1、winutils.exe问题2、SparkURL问题3、set_ugi()问题 本文主要收录PySpark开发环境搭建时常见的一些问题及解决方案,并收集一些相关资源 1、winutils.exe问题 报错摘要: WARN Shell: Did not find winutils.exe: {} ja…...
supervisor管理启动重启,Java,Go程序Demo
简介 Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启 1、安装 yum -y install supervisor2、配置默认配置文件 echo_supervisord_conf &g…...
HarmonyOs 4 (三) ArkTS语言
目录 一 认识ArkTs语言1.1 ArkTs1.2 基本结构 二 基本语法2.1 声明式UI2.1.1 创建组件2.1.1.1 无参数2.1.1.2 有参数2.1.1.3 组件样式2.1.1.4 组件方法2.1.1.5 组件嵌套 2.1.2 自定义组件2.1.2.1 基本结构2.1.2.2 成员函数/变量2.1.2.3 自定义组件的参数规定2.1.2.4 Build函数2…...
PostGIS学习教程九:空间连接
PostGIS学习教程九:空间连接 空间连接(spatial joins)是空间数据库的主要组成部分,它们允许你使用空间关系作为连接键(join key)来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示…...
C++ day56 两个字符串的删除操作 编辑距离
题目1:583 两个字符串的删除操作 题目链接:两个字符串的删除操作 对题目的理解 返回使两个单词word1和word2相同的最少删除多少个元素,两个单词至少包含一个字母,且仅包含小写字母 思路1:这道题与昨天的不同子序列…...
Android studio中如何生成jar包?
文章目录 需求背景目录结构gradle结构makeJar的语法解析 执行makeJar 任务拿到jar包 需求背景 别部门做C语言开发的同学开发了一个库,需要给我们Android端去调用。 我们拿到源码,首先需要做的是通过CMake去把C源码编译链接成动态库。 当然静态库也行&am…...
【2】基于多设计模式下的同步异步日志系统-设计模式
6. 相关技术知识补充 6.1 不定参函数 在初学C语⾔的时候,我们都⽤过printf函数进⾏打印。其中printf函数就是⼀个不定参函数,在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。 ⽽这种不定参函数在实际的使⽤中也⾮常…...
第十五届蓝桥杯模拟赛B组(第二期)C++
前言: 第一次做蓝桥模拟赛的博客记录,可能有很多不足的地方,现在将第十五届蓝桥杯模拟赛B组(第二期)的题目与代码与大家进行分享,我是用C做的,有好几道算法题当时自己做的也是一脸懵,…...
企业ERP软件定制开发要注意|app小程序搭建
企业ERP软件定制开发要注意|app小程序搭建 企业ERP软件定制开发是一项复杂而且关键的任务,它需要深入理解企业的需求和流程,并且以此为基础进行设计和开发。以下是一些关于企业ERP软件定制开发的注意事项。 首先,我们必须确保在进行定制开发之…...
系统架构设计-权限模块的设计
系统架构-权限模块的设计 如何评估一个研发人员技术水平,在大部分的情况下不是看其完成业务代码的好坏,更多的时候还是需要看这个研发人员从零构建一个完整项目的能力,在大公司中这样的机会可能相对较少,大部分的时间里都是对现有…...
IDEA切换Python虚拟环境
前言 因为之前一直使用的IDEA开发,换到VSCODE之后各种不习惯,特别是DEBUG的操作,特别难受,因此决心换回IDEA 环境配置 已有项目调整 进入Project 选择SDKs,新建Python 配置Conda以及虚拟环境 有就选择一个虚拟环境…...
《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测
1、前言 边缘检测: 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域,它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作,可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…...
prime靶机打靶记录
靶机下载地址 https://download.vulnhub.com/prime/Prime_Series_Level-1.rar nmap搜索目标 使用nmap -sn 192.168.41.0/24找到目标靶机192.168.41.136 扫描端口,因为是靶机,所以速率直接调了10000 扫出来两个端口22和80,进行详细的扫描 没…...
树莓派,linux换清华源
清华源网址 https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/ 更换软件源 鉴于国内网络环境下载各大镜像,软件包速度慢的问题,需要更换软件源,以防下载慢,且在本教程中,统一更换为清华源。 2.3.1 更换树莓派软…...
公有云迁移研究——AWS DMS
大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时,往往会遇到数据库迁移的任务。如果数据量不是特别大&…...
一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析
目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中,容器编排工具的选择对于简化流程、提高效率至关重要。本…...
IP地址定位不准确的情况研究
在互联网的浩瀚海洋中,每一台连接到网络的设备都被赋予了一个独特的标识符,这就是IP地址。它就像是我们在线身份的一部分,帮助我们与他人进行通信,获取信息,以及享受各种网络服务。然而,由于各种原因&#…...
武汉凯迪正大KDZD5289硫化曲线测试仪(电脑无转子硫化仪)
电脑无转子硫化仪 硫化时间测试仪 硫化曲线仪 硫化曲线测试仪 武汉凯迪正大KDZD5289产品概述 KDZD5289硫化曲线测试仪(电脑无转子硫化仪)采用电脑控制进口温控仪进行准确控温,计算机适时进行数据处理并可进行统计、分析、存储对比等ÿ…...
Topic和Partition
作用 主题作为消息的一级分类, 分区是对二级分类。分区是Kafka可伸缩性和水平扩展的关键, 也是多副本机制保证可用性的基础。分区可以有一到多个副本, 每个副本对应1个日志文件, 每个日志文件对应1到多个日志分段。每个日志分段又可以细分为日志文件, 索引文件和快照文件。 创…...
算法通关村第十四关|黄金挑战|数据流的中位数
数据流的中位数 原题:力扣295. 设计一种数据结构可以支持添加整数和返回中位数的操作。 之前写过找中间用两个堆,这道题就可以使用一个大顶堆和一个小顶堆。 大顶堆存储比较小的元素,小顶堆存储比较大的元素。 class MedianFinder {Prio…...
挑选数据可视化工具:图表类型、交互功能与数据安全
作为一名数据分析师,我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来,以便更好地理解和分析。在市面上的众多可视化工具中,我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…...
华纳云:有效解决服务器宕机的办法
服务器宕机可能是由多种原因引起的,包括硬件故障、软件问题、网络问题等。以下是一些简单的解决服务器宕机问题的办法: 检查硬件连接: 确保服务器的所有硬件连接正常。检查电源线、网络连接、存储设备连接等,确保没有松动或断开的…...
坦克大战-部分
通过键盘操控坦克移动,转弯,射击 消灭所有敌人可以过关 23个类,3个gif图片 wsad控制移动 j射击 砖墙限制移动,可以打穿;铁墙,限制移动,不能打穿;水&#x…...
OracleRac跨网段修改Public IP/VIP/Private IP/Scan IP
本验证于测试环境,生产操作需谨慎 现为测试环境,机器有且仅有两个网卡存在,需求修改Public IP/VIP/Private IP/Scan IP,把Public IP/VIP/Scan IP的网段改为Private IP的网段,Private IP于Public IP网段互换。 先停掉两…...
使用Pytorch从零开始实现BERT
生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 变分自编码器 [4] 生成对抗网络,高级生成对抗网络 I,高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…...
Python爬虫-新能源汽车销量榜
前言 本文是该专栏的第11篇,后面会持续分享python爬虫案例干货,记得关注。 本文以懂车平台的新能源汽车销量榜单为例,获取各车型的销量排行榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。 废话不多说,跟着笔者直接往下看正文详细内容。(附带…...
外包干了8个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...
wordpress基本插件/seo关键词是什么意思
我们比较熟知从当前场景切换到另一个场景,然而,其实可以在不卸载前一个场景的同时,再加载一个新的场景“资源”并叠加到当前游戏场景中去。可以通过SceneManager.LoadScene()函数的LoadSceneMode参数进行切换。一般的认知中,我们可…...
免费网站申请/百度手机助手app下载并安装
国战按计划进行,插7灵壁并在此集合,国战开始后很快就拿下寿春,并改7寿春雕像.这次好多了,绝大部分人都执行了命令,但还是有个别团友没有改7.吴攻寿春,被击退;龙攻许昌,也被击退.这种情况对我们很有利,许昌寿春两边刷,兄弟们想不上榜也难.可惜,人算不如天算,龙出重兵攻许昌,于是…...
石景山网站建设公司排行/百度小说排行榜总榜
U盘没反应?我来帮你 你是不是也是这样?这里有显示但是我的电脑里没有? 看看以下步骤能不能帮到你 第一步:右击我的电脑,点击管理 第二,点击设备管理器 在设备管理器列表中展开找到通用串行总线控制器&am…...
网站建设的销售怎么做/重庆网络seo公司
https://www.tiolive.com/nexedi/web_site_module/erp5_community/javascript-JQuery.SPA转载于:https://www.cnblogs.com/nbalive2001/archive/2013/03/13/2957702.html...
织梦wordpress帝国对比/市场调研流程
大浪淘沙的AI创业圈,触景无限正在这个技术浪潮中不断找寻自己的位置。 有人说,AI创业的大门已经慢慢关闭,场内的玩家也已基本定型,未来的战争将聚焦在头部几家,马太效应的收紧会使得一大波竞逐者生存艰难,…...
wordpress 文章 属性/广告推广平台代理
本文主要跟大家一起来探讨一下Cocos Creator小游戏开发过程中内存优化、性能优化和包体优化。 一、内存优化 因为 iOS小游戏和微信共用同一个进程,而微信在连续两次收到系统内存警告的时候会关闭小游戏并释放小游戏占用的内存。如果你的小游戏有外网用户反馈“闪退”…...