前言

Serverless架构是一个新的概念,也可以说是一个新的架构或者技术,但是无论他有多新,都不能一下子完成现有都开发习惯到Serverless架构的过渡,让现有的工程师放弃现有的Express、Koa、Flask、Django等框架直接在Serverless架构上开发项目,显然是不可能,就算可能,这也需要时间进行适应和过渡。

那么在这个过渡的期间我们是否可以考虑将现有的框架部署到Serverless架构上?接下来,我们以Flask框架进行一个简单的测试:测试四种接口:Get请求(可能涉及到通过路径传递参数)

Post请求(通过Formdata传递参数)

Get请求(通过url参数进行参数传递)

Get请求(带有jieba等计算功能)

测试两种情况:本地表现

通过Flask-Component部署表现

测试两种性能:传统云服务器上的性能表现

云函数性能表现

首先是测试代码:

from flask import Flask, redirect, url_for, request

import jieba

import jieba.analyse

app = Flask(__name__)

@app.route('/hello/')

def success(name):

return 'hello %s' % name

@app.route('/welcome/post', methods=['POST'])

def welcome_post():

user = request.form['name']

return 'POST %s' % user

@app.route('/welcome/get', methods=['GET'])

def welcome_get():

user = request.args.get('name')

return 'GET %s' % user

@app.route('/jieba/', methods=['GET'])

def jieba_test():

str = "Serverless Framework 是业界非常受欢迎的无服务器应用框架,开发者无需关心底层资源即可部署完整可用的 Serverless 应用架构。Serverless Framework 具有资源编排、自动伸缩、事件驱动等能力,覆盖编码、调试、测试、部署等全生命周期,帮助开发者通过联动云资源,迅速构建 Serverless 应用。"

print(", ".join(jieba.cut(str)))

print(jieba.analyse.extract_tags(str, topK=20, withWeight=False, allowPOS=()))

print(jieba.analyse.textrank(str, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))

return 'success'

if __name__ == '__main__':

app.run(debug=True)

这段测试代码是比较有趣的,它包括了最常用的请求方法、传参方法,也包括简单的接口和稍微复杂的接口。

本地表现

本地运行之后,通过Postman进行三个接口简单测试:Post参数传递:

Get参数传递:

通过Flask-Component部署表现

接下来,我们将这个代码部署到云函数中:

Yaml文档内容:

FlaskComponent:

component: '@gosls/tencent-flask'

inputs:

region: ap-beijing

functionName: Flask_Component

code: ./flask_component

functionConf:

timeout: 10

memorySize: 128

environment:

variables:

TEST: vale

vpcConfig:

subnetId: ''

vpcId: ''

apigatewayConf:

protocols:

- http

environment: release

部署完成

接下来测试我们的目标三个接口Get通过路径传参:Post参数传递:

Get参数传递:

通过上面的测试,我们可以看出,通过Flask-Component部署的云函数,也是可以具备常用的几种请求形式和传参形式。

可以这样说,一般情况下,用户的Flask项目可以直接通过腾讯云提供的Flask-component快速部署到Serverless架构上,可以得到比较良好的运行。

简单的性能测试

接下来对性能进行一波简单的测试,首先购买一个云服务器,将这个部分代码部署到云服务器上。

在云上购买服务器,保守一点买了1核2G

然后配置环境,到服务可以跑起来:

通过Post设置一下简单的Tests:

然后对接口进行测试:

非常顺利完成了接口测试:

可以通过接口测试结果进行部分可视化:

同时对数据进行统计:

可以看到,通过上图和上表,服务器测的整体响应时间都快于云函数的响应时间。而且可以看到函数存在冷启动,一按出现冷启动,其响应时间会增长20余倍。在由于上述测试,仅仅是非常简单的接口,接下来我们来测试一下稍微复杂的接口,使用了jieba分词的接口,因为jieba分词接口存在:

测试结果:

可视化结果:

通过对Jieba接口的测试,可以看到虽然服务器也会有因分词组件进行初始化而产生比较慢的响应时间,但是整体而言,速度依旧是远远低于云函数。

那么问题来了,是函数本身的性能有问题,还是增加了Flask框架+APIGW响应集成之后才有问题?

接下来,做一组新的接口测试,在函数中,直接返回内容,而不进行额外处理,看看函数+API网关性能和正常情况下的服务器性能对比

可以看出虽然最小和平均耗时的区别不是很大,但是最大耗时基本上是持平。可以看出来,框架的加载会导致函数冷启动时间长度变得异常可怕。

接下来通过Python代码,对Flask框架进行并发测试:

对函数进行3次压测,每次并发300:

===========task end===========

total:301,succ:301,fail:0,except:0

response maxtime: 1.2727971077

response mintime 0.573610067368

===========task end===========

total:301,succ:301,fail:0,except:0

response maxtime: 1.1745698452

response mintime 0.172255039215

===========task end===========

total:301,succ:301,fail:0,except:0

response maxtime: 1.2857568264

response mintime 0.157210826874

对服务器进行3次压测,同样是每次并发300:

===========task end===========

total:301,succ:301,fail:0,except:0

response maxtime: 3.41151213646

response mintime 0.255661010742

===========task end===========

total:301,succ:301,fail:0,except:0

response maxtime: 3.37784004211

response mintime 0.212490081787

===========task end===========

total:301,succ:301,fail:0,except:0

response maxtime: 3.39548277855

response mintime 0.439364910126

通过这一波压测,我们可以看到这样一个奇怪现象,那就是在函数和服务器预热完成之后,连续三次并发301个请求。函数的整体表现,反而比服务器的要好。这也说明了在Serverless架构下,弹性伸缩的一个非常重要的表现。传统服务器,我们如果出现了高并发现象,很容易会导致整体服务受到严重影响,例如响应时间变长,无响应,甚至是服务器直接挂掉,但是在Serverless架构下,这个弹性伸缩的能力是云厂商帮助我们做的,所以在并发量达到一定的时候,其实Serverless架构的优势变得会更加明显。

总结:Flask是可以通过很简单的方法上Serverless架构,用户基本上可以按照原生Flask开发习惯来开发Flask项目,尤其是使用Flask开发接口服务的项目,更是可以比较容易的迁移到Serverless架构。

整体框架迁移上Serverless架构可能要要注意几个额外的点:如果接口比较多,可能要按照资源消耗比较大的那个接口来设置内存大小,以我例子中的情况,非jieba接口使用的时候,可以使用最小内存(64M),jieba接口使用的时候,需要256M的内存,而整个项目是一体的,只能设置一个内存,所以为了保证项目可用性,就会整体设置为256M的内存,这样一来如果另外三个接口访问比较多的前提下,可能资源消耗会相对增加比较大,所以,如果有条件的话,可考虑将资源消耗比较大的接口额外提取出来;

云函数+API网关的组合对静态资源以及文件上传等的支持可能并不是十分友好,尤其是云函数+API网关的双重收费,所以这里建议将Flask中的一些静态资源统一放在对象存储中,同时将文件上传逻辑修改成优先上传到对象存储中,可以参考之前的文章:【实践与踩坑】用Serverless怎么上传文件?框架越大,或者框架内的资源越多函数冷启动的时间可能会越大。这一点是非常值得重视的。在刚才测试过程中,非框架下,最高耗时是平均耗时的3倍,而在加载Flask框架和Jieba的前提下,最高耗时是平均的10+倍!如果可以保证函数都是热启动还好,一旦出现冷启动,可能会有一定的影响。

由于用户发起请求是客户端到API网关再到函数,然后从函数回到API网关,再回到客户端,这个过程相对直接访问服务器获得结果的链路明显长了一些,所以在实际测试过程中小用户量对的表现发而不是很好,几次测试,基本上1核2G的服务器都是优于函数表现。但是当并发量上来的之后可以看到函数的表现实现了大超车,一度超越这台1核2G的服务器。那么这里有一个有趣的结论:对于极小规模请求,函数是按量付费,虽然性能上有一定的劣势,但是按量付费在价格上有一定的优势;当流量逐渐变大之后,函数在性能上的优势也逐渐凸显。

我相信,Serverless架构会随着时间的发展,越发的成熟,目前可能还有或多或少的问题,但是不久的将来,一定不负众望。

django 热启动_传统的Web框架如何部署在Serverless架构上(以Flask为例)相关推荐

  1. Python框架篇之Django(Django项目搭建全过程、Web框架与Django)

    文章目录 一.Web框架与Django本质 二.从安装到实现一个完整的Django项目 一.Web框架与Django本质 1.Web框架的理解 框架,特指为解决一个开放性问题而设计的具有一定约束性的支 ...

  2. 使用python下载文件_利用python web框架做文件流下载

    把时序数据库中的日志下载到本地. 大家都知道. 数据库里的数据 都是存在数据库里的(废话). 想把他下载到客户的本地. 有的同学第一反应是: 只有文件才能下载. 所以大多数同学会想到先把数据从数据库中 ...

  3. python bottle框架 重定向_微型 Python Web 框架: Bottle

    Bottle 是一个非常小巧但高效的微型 Python Web 框架,它被设计为仅仅只有一个文件的Python模块,并且除Python标准库外,它不依赖于任何第三方模块. 路由(Routing):将请 ...

  4. c/s三层结构信息系统的三个层次_如何使用ABP框架(2)三层架构与领域驱动设计的对比...

    本文来自长沙.NET技术社区,原创:邹溪源.全文共有8500字,读完需耗时10分钟. 题图来自@pixabay 简述 上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项 ...

  5. 5个java框架及其优缺点_各种Java Web框架的优缺点是什么?

    慕森王 我已经相当广泛地使用了Tapestry 3,Wicket,Echo和JSF.我真的建议您仔细检查一下,选择最适合您的方式,并且最适合您的工作方式.其中,由于组件构建的轻量级特性和页面模板的简单 ...

  6. 基于java的人力资源管理系统_基于Java Web的企业人力资源管理系统的设计与实现(样例3)...

    <基于Java Web的企业人力资源管理系统的设计与实现.doc>由会员分享,可免费在线阅读全文,更多与<基于Java Web的企业人力资源管理系统的设计与实现>相关文档资源请 ...

  7. python热部署_关于Spring Cloud 框架热部署的方法

    1.在对应的pom.xml 文件中添加依赖 org.springframework.boot spring-boot-devtools true 2.注:project 中添加 spring-boot ...

  8. springcloud阿里巴巴五大组件_如何无缝迁移 SpringCloud/Dubbo 应用到 Serverless 架构

    简介: 本文分为三部分来介绍,分别介绍微服务应用迁移到 SAE 的优势,如何迁移 SpringCloud/Dubbo 应用到 SAE 上,以及针对 SpringCloud 应用迁移的实践演示. 背景 ...

  9. 如何将传统 Web 框架部署到 Serverless

    背景 因为 Serverless 的"无服务器架构"应用相比于传统应用有很多优点,比如:无需关心服务器.免运维.弹性伸缩.按需付费.开发可以更加关注业务逻辑等等,所以现在 Serv ...

最新文章

  1. Linux那些事儿 之 戏说USB(5)我是谁
  2. 如何用c语言打出 * * * * * * * * * * * * *?
  3. Python遥感数据主成分分析
  4. matlab信息隐藏算法,实验四--基于DCT域的信息隐藏算法
  5. 启动tomcat遇到的问题整理
  6. 要玩就玩大的 夏普展示1,000,000:1对比度液晶电视
  7. Linux的crond的配置流程,Linux之定时任务Crond详解
  8. 计算机应用基础教程清华大学,清华大学出版社-图书详情-《大学计算机应用基础教程(第3版)》...
  9. 「00后缩写黑话翻译器」登上GitHub热榜
  10. 我爱淘冲刺阶段站立会议2每天任务4
  11. 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music
  12. 区块链应用 | 高盛报告深度解读:区块链在未来的5大应用
  13. 404页面是什么意思?怎么正确设置?
  14. Only fullscreen activities can request orientation异常解决
  15. C++:函数指针调用方法
  16. ROS简介(新手入门须知)
  17. 蓝牙室内定位,SOC芯片NRF52832
  18. Linux---/proc目录全讲解
  19. 眼睛疲劳及干涩的防治
  20. 【H5+ Quick-cocos2dx整合】之iOS 二 集成H5+ SDK

热门文章

  1. springboot开发(yml配置和注解解析)
  2. 迷你世界远古机器人_迷你世界:第三款机器人即将上线,网友5000迷你币抽新坐骑,哭了...
  3. 运算放大器基本公式_还在被三阶/四阶/运算放大器滤波器PLL这些概念困扰?这篇文章帮你搞懂它...
  4. python画矩阵图_Python根据已知邻接矩阵绘制无向图操作示例
  5. 知乎内容营销新动作:别处种草 知乎种树
  6. 卖一头猪亏500元,“猪茅”也扛不住了?
  7. 微信出拳:狠起来,连自己人都不放过!
  8. 华为带动涨价?二季度中国市场智能手机均价涨了13%
  9. 线上安全大会还能这么玩 ISC 2020首创“3D立体云展馆”
  10. 您的618快递正在燃烧?12吨快递货车高速上起火,网友:代入感极强!