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

无服务器云函数(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. [Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度

    多值字段(Multivalue Fields) 在多值字段上使用短语匹配会产生古怪的行为: PUT /my_index/groups/1 { "names": [ "Jo ...

  2. TCP/IP具体解释--UDP数据报中的IP分片

    1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...

  3. C#调用RESTful API

    如今非常多的网络服务都用RESTful API来实现. 比方百度的搜索推广API介绍使用Rest原因:REST+JSON风格的API相比SOAP+XML,优点是:调用更加灵活.也更easy扩展:JSO ...

  4. Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...

  5. inline-block并列排序时候的影响

    当两个设置了inline-block属性的元素并列排放时,它们的位置能够互相影响. 元素结构: <div class="container"> <div clas ...

  6. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  7. 体验mssql-cli

    1. 背景 安装SQL Server on Linux之后,在命令行下使用sqlcmd,你会发现代码提示,语法高亮,甚至连多行复制都不支持,相比之下,MySQL的命令行客户端还好用多了.只做简单的命令 ...

  8. CoreJava逻辑思维-顺时针打印自定义矩阵

    CoreJava逻辑思维-顺时针打印自定义矩阵 这两天回顾了一下刚入Java时的一些比较有意思的逻辑题,曾经也费劲脑汁的思考过的一些问题,比如百钱百鸡最简单的算法啦之类的,而今天博主想说的是一个循环打 ...

  9. 晒下我在2017年所阅读的JavaScript书单

    前言 学习是一个持续不断的过程,在互联网技术里畅游的程序猿们,对学习的渴望更是难以穷尽.2017即将逝去,2018已经漏出曙光,回顾这一年,在学习的路上收获还是颇丰的,下面就晒一晒2017年我所学习的 ...

  10. Hibernate--使用xml配置映射关系

    写在前面: 配置实体类与数据库的映射关系,有两种方式: 1.使用*.hbm.xml  2.使用@注解 二:xml的配置方式: eg:员工的xml配置文件: <?xml version=" ...