欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~
作者:李想

无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service,函数即服务) 产品。其核心理念是让用户将重心放在业务的逻辑实现上,而不用关心底层的运维包括服务器、存储、网络、自动扩缩容、负载均衡、代码部署等问题。

云函数既然以函数这两个字来命名,其应用场景也是跟函数是极为相似的,即对一段数据执行函数计算然后进行输出。腾讯云云函数提供了各类触发器来控制函数的执行条件,代码完全由事件触发,平台根据请求自动平行调整服务资源,所以SCF特别适合需要在某些情景下需要进行数据处理的场合。例如用户上传文件之后过滤是否有违规字段,或者用户上传视频文件之后进行转码等。

腾讯云的SCF底层也是基于容器进行构建,用户的代码会加载到容器内进行执行,所以效率和性能方面能够得到保证。同时使用VPC和Unix Socket来隔离用户环境与管理环境,保证了SCF使用的安全性。函数可自动在每个地域中随机地选择可用区来运行,免除单可用区运行的故障风险。根据事件请求数量,云函数将自动横向扩容/缩容,无需用户自行配置扩缩容条件,扩容数量理论上没有上限。

提到云函数SCF也顺便提一下腾讯云将要推出的另外一个产品--批量计算。从本质上来讲批量计算和云函数都是将业务逻辑代码进行抽象而提供统一的入口供用户使用,但是两者在使用场景上也有一些区别。批量计算主要是为了处理大数据而设计的,其最关键的技术是可以对原始数据进行分片而将分片的数据分配到不同的节点进行处理,而云函数本身尽管可以并发执行,但是其处理的一般为流数据,数据量相对较小,耗时也相对较短。举个例子,如果我们需要对用户上传的文件进行实时处理,建议使用云函数SCF,而如果需要将硬盘上现有的比如几个T的用户数据进行处理,建议使用批量计算进行分批处理。

我们就以一个真实的数据来把玩一下腾讯云无服务器云函数,让大家能更好的理解云函数。数据来源于美国NCDC的天气数据:ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/

里面记录了从1900年至今所有监控点每天的监控数据,我们以2017年的数据为例(ftp://ftp.ncdc.noaa.gov/pub/data/noaa/isd-lite/2017/),里面的每一个.gz文件代表一个监控点全年的监控数据。

010010-99999-2017.gz 解压之后的文件内容如下:

2017 01 01 22 -48 -97 10205 340 60 -9999 -9999 -9999

2017 01 01 23 -47 -99 10202 346 55 -9999 -9999 -9999

2017 01 02 00 -49 -93 10190 330 90 6 -9999 4

2017 01 02 01 -47 -96 10190 346 72 -9999 -9999 -9999

2017 01 02 02 -50 -98 10189 320 40 -9999 -9999 -9999

2017 01 02 03 -47 -95 10185 328 30 -9999 -9999 -9999

2017 01 02 04 -52 -95 10176 320 20 -9999 -9999 -9999

2017 01 02 05 -62 -97 10163 310 20 -9999 -9999 -9999

2017 01 02 06 -57 -91 10150 260 20 8 -9999 -9999

2017 01 02 07 -46 -86 10141 230 30 -9999 -9999 -9999

2017 01 02 08 -37 -72 10131 206 45 -9999 -9999 -9999 .....

NCDC官方也给出了文件格式说明,1-13位记录的是观测时间,14-19位记录了观测的温度(以10倍的摄氏度进行记录)。

Field 1: Pos 1-4, Length 4: Observation Year Year of observation,

rounded to nearest whole hourField 2: Pos 6-7, Length 2: Observation Month Month of observation,

rounded to nearest whole hourField 3: Pos 9-11, Length 2: Observation Day Day of observation,

rounded to nearest whole hourField 4: Pos 12-13, Length 2: Observation Hour Hour of observation,

rounded to nearest whole hourField 5: Pos 14-19, Length 6: Air Temperature The temperature of the

air UNITS: Degrees Celsius SCALING FACTOR: 10 MISSING VALUE: -9999Field

6: Pos 20-24, Length 6: Dew Point Temperature The temperature to

which a given parcel of air must be cooled at constant pressure and

water vapor content in order for saturation to occur. UNITS: Degrees

Celsius SCALING FACTOR: 10 MISSING VALUE: -9999

假设我们有这样一个需求:每当我们上传一个观测点的数据gz文件,我们需要统计出该观测点的最高温度,并且在输出中要同时记录该观测点的站点代码(从文件名获取)。

首先我们在腾讯云COS对象存储上新建两个bucket,fredtest bucket用来上传源数据文件,output bucket用来生成输出文件。

存储桶列表

如果需要模拟批量上传,可以参考下面的Python脚本,其本质就是通过FTP拉取数据然后上传到COS。

https://github.com/xianl/SCF/blob/master/download.py

下面来编写具体的实现函数,主要需要完成下面几件事情。

  • 1.上传文件后函数触发,获取上传文件的路径
  • 2.调用COS SDK下载该文件,保存到/tmp目录
  • 3.解压文件,读出数据内容
  • 4.处理数据,计算出温度最大值
  • 5.将监控点代号以及计算出来的温度最大值除以10保存到/tmp目录
  • 6.将最终结果上传到COS output bucket。

核心部分的代码实现如下,完整代码可参考https://github.com/xianl/SCF/blob/master/action.py

需要了解的是,main_handler的event参数将传入所上传文件的信息,其本质是一个json文件,例如event'Records''cos''name'可以拿到bucket信息。

def action_handler(event, context):

    #Create CosClient to upload/download COS file
appid = # change to user's appid
secret_id = u'xxx' # change to user's secret_id
secret_key = u'xxx' # change to user's secret_key
region = u'sh' # change to user's region
cos_client = CosClient(appid, secret_id, secret_key, region) #specify the source and destination bucket location
source_bucket = event['Records'][]['cos']['cosBucket']['name']
source_bucket_file_key = '/' + event['Records'][]['cos']['cosObject']['key'].split('/')[-]
source_file_name = source_bucket_file_key.split('/')[-].split('.')[]
dest_bucket = u'output'
dest_bucket_file_key = u'/max_temperature_'+ source_file_name #specify the temp file location
source_file_tmp_path = u'/tmp/' + source_file_name
dest_file_temp_path = u'/tmp/max_temperature_' + source_file_name #download the source file from cos bucket and take actions
download_ret = download_file(cos_client,source_bucket,source_bucket_file_key,source_file_tmp_path)
if download_ret == :
dest_file_temp = open(dest_file_temp_path, 'w')
max_temp = -999.9 #find the maximum temperature
with gzip.open(source_file_tmp_path) as inputfile:
for line in inputfile:
temp = int(line[:]) / 10.0
if temp > max_temp:
max_temp = temp #write the result to the temp file and upload to the cos bucket
dest_file_temp.write(source_file_name + ' ' + str(max_temp))
dest_file_temp.close()
upload_ret = upload_file(cos_client, dest_bucket, dest_bucket_file_key, dest_file_temp_path)
return upload_ret
else:
return -

在COS的同一个区域建立SCF云函数,执行方法为SCF的函数入口,设置为index.main_handler, 同时在代码框内贴入代码。

无服务器函数代码

第三步需要选择触发方式为COS触发,并选择COS bucket为fredtest。

设置触发方式

在fredtest bucket上传010010-99999-2017.gz文件之后,查看SCF的日志可以看到函数被正常触发了。

无服务器函数日志

output bucket同时会按照代码逻辑生成max_temperature_010010-99999-2017 文件

输出文件

文件内容为站点代码以及最后计算出的最大温度14.3℃,满足预期需求。至此,一个简单的SCF实际数据应用场景的demo就跑完了。

计算结果

总结

可以看到腾讯云SCF非常适用这种单入单出的数据处理场景,业务人员只需编写代码并在界面上进行简单的配置即可实现业务逻辑,而其所需接触的对象仅仅是例如对象存储,Message Queue,数据库等应用层对象而完全不需关心服务器,网络等基础资源,简化了很大一部分人为操作。如果能够再结合API Gateway等产品,也能够做到各个系统的业务解耦以及迭代开发。

另外,至于前文提到的批量计算,目前腾讯云还处于内测阶段,等公测之后我还会写一篇文章利用2017年的上万各监测点的数据使用批量计算来计算出2017年整年的最高温度,尽请期待。

相关阅读

使用腾讯云 scf 云函数压缩 cos 对象存储文件

serverless 初探


 
此文已由作者授权云+社区发布,转载请注明原文出处

使用腾讯云无服务器云函数(SCF)分析天气数据的更多相关文章

  1. 由浅入深SCF无服务器云函数实践

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...

  2. 阿里云ECS服务器云监控(cloudmonitor)Go语言版本插件安装卸载与维护

    云监控Go语言版本插件安装_主机监控_用户指南_云监控-阿里云https://help.aliyun.com/document_detail/97929.html 云监控cloudmonitor 1. ...

  3. Serverless无服务器云函数入门唠叨

    B站录了个视频: https://www.bilibili.com/video/av59020925/

  4. .NET Core和无服务器框架

    无服务器框架是一个云提供商无关的工具包,旨在帮助构建,管理和部署无服务器组件的操作,以实现完整的无服务器架构或不同功能即服务(FaaS).无服务器框架的主要目标是为开发人员提供一个界面,该界面抽象出云 ...

  5. 专访阿里云 Serverless 负责人:无服务器不会让后端失业

    2012 年,云基础设施服务提供商 Iron.io 的副总裁 Ken 谈到软件开发行业的未来,首次提出了 Serverless 的概念,为云中运行的应用程序描述了一种全新的系统体系架构.此后,以 AW ...

  6. 再谈腾讯云centos服务器不能登录的解决过程

    上篇文章谈到腾讯云centos服务器不能登录,通过查看监控信息,cpu使用过高,再腾讯云页面使用VNC方式直接登录,然后根据提示信息,关闭导致内存溢出的进程,从而解决问题. 1 问题再现 昨天刚解决了 ...

  7. 小程序应用的Python服务器部署高配,依然是腾讯云秒杀阿里云!

    上一篇文章,“小程序创业最低配置部署,腾讯云折扣秒杀阿里云!”介绍了小程序项目启动时的最低配置服务器选择,但当项目良好发展时,还是要把服务器配置调整到标准水平,承受住日益增长的流量访问. 随着Pyth ...

  8. 关于购买Redis服务器:腾讯云、阿里云还是华为云?

    个人分类: redis使用 编辑 新年伊始,很多商家都开始进行新年产品大促销,在分布是缓存Redis领域,几家大公司也是打得如火如荼,各有千秋啊. 现在市场上比较有口碑的商家有腾讯云.阿里云.华为云三 ...

  9. 无公网IP的阿里云ESC服务器如何访问外部网络

    新购买了3台阿里云ECS服务器(centos7)和弹性公网IP(EIP),虽然是从事计算机行业的人员但俺不是计算机网络从业人员

随机推荐

  1. 》》Jqurey html

    第1部分:jQuery HTML 1.获取内容和属性 -- 获取内容: text():设置或获取所选元素的文本内容 html():设置或获取所选元素的内容(包括HTML标记) val():设置或获取表 ...

  2. android boot.img

    android在启动时uboot推断有没有组合健按下或者cache分区的升级文件来决定进入哪个系统(可能还有别的推断方式) 有组合健按下或者cache分区有升级文件,则载入recovery.img进入 ...

  3. CEF中JavaScript与C++交互

    在CEF里,JS和Native(C/C++)代码能够非常方便的交互,这里https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegr ...

  4. HttpClient4.2 Fluent API学习

    相比于HttpClient 之前的版本号,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Flue ...

  5. Nginx事件处理中的connection和read、write事件的关联

    /*********************************************************************  * Author  : Samson  * Date   ...

  6. Maven实战(九)——打包的技巧

    "打包"这个词听起来比較土.比較正式的说法应该是"构建项目软件包".详细说就是将项目中的各种文件,比方源代码.编译生成的字节码.配置文件.文档,依照规范的格式生 ...

  7. 5. Effective Java 第三版——使用依赖注入取代硬连接资源

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. 十、 Spring Boot Shiro 权限管理

    使用Shiro之前用在spring MVC中,是通过XML文件进行配置. 将Shiro应用到Spring Boot中,本地已经完成了SpringBoot使用Shiro的实例,将配置方法共享一下. 先简 ...

  9. 码农的奋斗之路 CTO说 读后感

    拜读了各位大神的分享,对CTO的职责有了进一步的认识. 什么是CTO? CTO需要具备哪些技能? CTO与管理 CTO的作用是什么? 如何体现CTO的价值? CTO撸不撸代码? 小结

  10. attr设置checked,disabled等属性失效的问题,jquery的attr和prop的区别

    最近做项目遇到一个问题,radio设置了默认checked值,attr("checked",true)切换checked值失效 最后发现是jquery1.6版本之后,attr和pr ...