前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >由浅入深 SCF 无服务器云函数实践

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

原创
作者头像
腾讯云技术
修改于 2018-01-15 02:53:33
修改于 2018-01-15 02:53:33
5.8K10
代码可运行
举报
文章被收录于专栏:云技术活动云技术活动
运行总次数:0
代码可运行

作者: 腾讯云架构平台部技术专家    陈杰

  近年来,互联网服务从一开始的物理服务器托管虚拟机容器,发展到现在的云函数,逐步无服务器化,如下表所示。程序员逐步聚焦于最核心的业务逻辑开发,解放了生产力,显著提升了服务上线效率。

分类

物理机托管

虚拟机

容器

云函数

托管

机房运维

物理机运维

OS运维

服务运维

收益

无人工值守

调度自动化

交付标准化

计算服务化

效率

开发(天)/部署(小时)

开发(天)/部署(分钟)

开发(天)/部署(秒)

开发(分钟)/部署(毫秒)

  云函数带来了真正的计算服务,如下表所示,类比腾讯云COS对象存储,SCF以函数为单位封装计算,按需调度执行,无须关心函数的自动扩缩容,故障容灾等,无任何闲置成本。

分类

cos对象存储

无服务器云函数

目标

数据托管

计算托管

单位

文件

函数

接口

上传/下载/修改/删除文件

上传/执行/修改/删除/函数

计费

文件容量大小/存储时长/下载上传流量

函数资源大小/执行时长/计算流量

  云函数给用户带来的价值主要3点:

  1. 简化架构:函数粒度的微服务架构,使得系统的各个功能天然解耦,能像搭积木一样组合自有及外部服务,实现所看即所得的后台服务;
  2. 简化开发:无需关注底层硬件配置、OS,服务启停、网络收发,故障容灾,服务扩缩容等,只需写最核心的业务逻辑,实现真正的代码即服务;
  3. 简化运维:无须关注服务部署,服务器运维,安全管控,扩缩容配置等,且应用能无缝升级,实现无痛切换到DevOps模式。
  4. 减少支出:无闲置成本,仅对函数资源大小,执行时间,执行次数按需计费,相对云主机平均5%~15% 的使用率,价格优势明显,实现了最彻底的按需计费。

  我们团队正在做弹性计算相关的事情,业务需求多,平台自身也需持续优化来支撑不断扩大的运营规模,现在5人左右的小团队要支撑100w核级别的计算运营,云函数的出现,正好解了我们在人力上的燃眉之急,在这里分享一下,希望能对大家有所启发。

使用云函数实现主动拨测工具

  我们有一些低频调用的http服务,比如buffer池空闲机器借还,上架等,这类服务用户调用出错时处理代价较大,要确保用户调用时服务正常,需要有主动拨测的机制,先于用户发现并修复问题,在云函数出现之前,需要开发拨测工具,实现定时调用,并实现工具本身的故障容灾能力,且要申请2台以上的虚拟机或容器发布部署,既耗费人力,也耗费资源。应用云函数后,我们只需简单的3步便可实现:

  1. 在SCF云函数平台创建一个函数,如下图所示。

createfunc.png
createfunc.png

2. 配置该函数为定时触发,比如5分钟触发一次,如下图所示,配置完成后服务即刻启用。

2.png
2.png

3.可以在日志页面查看函数运行状态,当检测到异常时,会调用告警工具发送告警微信。

3.png
3.png

  在主动拨测工具这个场景,我们从云函数获得的收益主要是快速成形,且无需运营维护,达到了既定目标同时,没有额外增加运营成本。SCF无服务器云函数为每个用户设置了免费额度,该应用场景几乎肯定能包含在免费额度之内。

使用云函数规整运营统计脚本

  我们之前用python开发了大量统计脚本,用来展现平台的运营概况,可用性,质量,趋势等,由crontab驱动每日定期执行,随着时间累积及人员的更替,这些脚本部署管理逐步混乱,比如想要修复某个数据时,可能不知道脚本部署在哪,或者某天服务器故障,恢复统计脚本的正常运营比较麻烦,针对这些问题,我们利用云函数简单包装便可解决,比如下面是一个统计运营中母机数的函数,直接import原脚本,在入口函数内调用即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
from ctypes import *
import os
import base64
import json
import calculate_biz_host_num

def main_handler(event, context):
    return calculate_biz_host_num.main()

if __name__ == '__main__':
    '''just for test'''
    event = {}
    lambda_handler(event, 4)

  在规整运营统计脚本这个场景,我们从云函数获得的主要收益是快速帮助我们把散落到各台服务器的脚本规整起来统一维护,且再也不用担心统计脚本运营与服务器故障问题。

使用云函数快速嵌入图片类型识别功能

  我们有一个图片压缩服务,上传时压缩图片以降低存储容量及下载带宽消耗,压缩的效果要达到图片质量与压缩比的均衡,在某些场景,比如微信朋友圈,存在一些广告图片,用户一般不会关注其细节,故可以提高压缩比,牺牲质量以进一步的降低运营成本,而图片类型的识别计算复杂度高,无法在逻辑svr本地完成,传统的办法是实现一个图片类型识别服务,但实现该服务需要开发工作量较大,比如需要写接入,逻辑server,实现容灾分布,负载均衡等,且由于图片上传有明显的波峰波谷效应,还需要实现自动扩缩容,不仅如此,部署也较为复杂,难以满足快速试错的需求。

4.png
4.png

  应用云函数后,我们只需创建并实现一个类型识别函数,如下所示,在函数里调用算法工程师实现的C++图片识别程序即可,无须关心容灾分布,负载均衡,自动扩缩容及服务的部署与运维等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
from ctypes import *
import os
import pictype
import base64
import json

def main_handler(event, context):
    str = pictype.cppmain(event["pic_data"])
    jso = json.loads(str)
    print jso["QRCode"]
    return str

if __name__ == '__main__':
    '''just for test'''
    event = {}
    imageFile = open("2qrcode.jpg","rb")
    event["pic_data"] = base64.b64encode(imageFile.read())
    imageFile.close()
    lambda_handler(event, 4)

  在嵌入图片类型识别功能这个场景,我们从云函数获得的主要收益是使用极小的成本便快速扩展了现有平台的能力,短时间内便试错验证了依据图片类型选择不同压缩比在运营成本上的收益。

使用云函数实现游戏AI数据预处理

  尝到甜头后,我们越来越有信心使用云函数来实现更复杂的需求,正好当前在支持游戏AI团队做一些计算,典型的AI计算过程如下图所示,模型训练前的数据预处理耗费了大量的时间与计算资源。

5.png
5.png

  以王者荣耀的AI为例,如下图所示,数据预处理一般分为两步:

  1. Mapper计算:从cos读取游戏录像文件,提取英雄等级,血量,攻击,法强,技能冷却等特征,使用hdf5文件保存;
  2. Reducer计算:读取选定范围的hdf5文件,shuffle处理随机化后,规整成每个文件5120帧,再输出供模型训练使用;

6.png
6.png

  我们应用云函数实现该预处理,只需实现mapper/reducer计算函数,并配置合适的计算触发规则即可,比如实现Mapper函数如下所示(省略若工具型函数代码),并配置为cos上传触发,这样当有录像文件上传时,可自动调用mapper函数转化为hdf5文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding utf-8 -*-
import os
import sys
import datetime
import traceback
import shutil
import commands
import cos_sdk


def main_handler(event, context):
    res = map_caller(event, context)
    if res == 0:
        return "succ"
    else:
        return "fail"

def map_caller(event, context):
    # Note: this is test account, change to own cos appid and secret_id
    appid = '123443xxxx'
    secret_id = 'QmFzZTY0IGlzIGEgZ2Vxxxx'
    secret_key = 'AKIDZfbOA78asKUYBcXFrJD0a1ICvxxxx'
    host = 'sz.cxxxxxx'
    addr = '10xxxx'

    bucket = event['bucket']
    cos_input_file = event['input']
    cos_output_key = event['output']
    cos_file_name = cos_input_file.split('/', 1)[1]
    print("cos_file_name: ", cos_file_name)

    # step 1. Download .abs file from cos
    cos = cos_sdk.CosHandler(appid, bucket, secret_id, secret_key, host, addr )
    container_base_path = '/tmp/AITest/mapper'
    container_input_path = '/tmp/AITest/mapper/input/'
    container_output_path = '/tmp/AITest/mapper/output/'
    cos_output_path = 'mapdata/'

    try:
        if not os.path.exists(container_base_path):
            os.makedirs(container_base_path)
        if not os.path.exists(container_input_path):
            os.mkdir(container_input_path)
        if not os.path.exists(container_output_path):
            os.mkdir(container_output_path)
    except:
        traceback.print_exc()
        return -1

    ret = cos.download_file('/', cos_input_file, container_input_path, cos_file_name)
    if not ret:
        print("Download file from cos Failed [%s]" % cos_file_name)
        return -1
    print("Download file [%s] succ" % cos_file_name)

    # step 2. transfer .abs file to .hdf5
    ret = transfer_data(container_base_path, container_input_path, cos_file_name, container_output_path)
    if not ret:
        print("transfer data fail")
        return -1

    # step 3. upload .hdf5 file to cos
    output_filename = get_output_file(cos_file_name, container_output_path)
    if output_filename == "":
        return -1
    print(container_output_path+output_filename)
    if not os.path.exists(container_output_path+output_filename):
        print "output file not exist"
    print(cos_output_path+output_filename)
    ret = cos.upload_file(container_output_path+output_filename, cos_output_path+output_filename)
    if not ret:
        return -1

    ## clean up result files
    shutil.rmtree(container_output_path)
    return 0

def transfer_data(base_path, file_path, file_name, output_path):
    try:
        CurPath = '/var/user'
        if os.path.exists(base_path + '/transfer_script'):
            shutil.rmtree(base_path + '/transfer_script')
        shutil.copytree(CurPath + '/transfer_script', base_path + '/transfer_script')
        StartPath = base_path + "/transfer_script/5v5_vecmodel_tactics"
        InputFilePath = file_path + file_name
        OutputPath = output_pat
        sgameBinFile = base_path + "/transfer_script/log_transform/bin/transform/sgame_log_transform"
        os.chmod(sgameBinFile, 755)
        labelBinFile = StartPath + "/label"
        featureBinFile = StartPath + "/VecFeatureExtract"
        os.chmod(labelBinFile, 755)
        os.chmod(featureBinFile, 755)
        os.chdir(StartPath)
        cmd = 'sh start.sh ' + InputFilePath + ' ' + OutputPath
        (status, output) = commands.getstatusoutput(cmd)
        print("status: ", status)
        print("output: ", output)
    except:
        traceback.print_exc()
        return False

    if status == 0 and output == "pipeline success":
        return True
    else:
        return False

  实现Reducer函数如下所示(省略若工具型函数代码),亦可配置cos写文件触发,当上传文件数达到一定数量且符合其他条件时,执行reducer函数的处理功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding utf-8 -*-
import os
import sys
import traceback
import shutil
import commands
import re
import common
import cos_sdk

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET


def main_handler(event, context):
    res = reducer_caller(event, context)
    if res == False:
        return "fail"
    else:
        return "succ"

def reducer_caller(event, context):
    # Note: this is test account, change to own cos appid and secret_id
    appid = '12344321xxx'
    secret_id = 'QmFzZTY0IGlzIGEgZ2xxxx'
    secret_key = 'AKIDZfbOA78asKUYBcXFrJD0axxx'
    host = 'sz.xxxx'
    addr = '10.xxxx'

    bucket = 'mapreduce'
    container_base_path = '/tmp/AITest/reducer'
    container_mapfile_path = '/tmp/AITest/reducer/mapdata/'
    container_output_path = '/tmp/AITest/reducer/output/'
    cos_mapdata_dir = '/'
    cos_output_key = u'output/'

    ## AI shuffle config
    p0_thread_num = '30'
    p1_thread_num = '4'
    ai_bucket = '4'
    sample_num = '5120'

    ## init container directory
    try:
        if not os.path.exists(container_base_path):
            os.makedirs(container_base_path)
        if not os.path.exists(container_mapfile_path):
            os.mkdir(container_mapfile_path)
        if not os.path.exists(container_output_path):
            os.mkdir(container_output_path)
    except:
        traceback.print_exc()
        return False

    cos = cos_sdk.CosHandler(appid, bucket, secret_id, secret_key, host, addr)

    ## step 1. get all mapper output data name (*.abs)
    min_mapfiles = 40
    mapfiles = get_mapfiles(cos, bucket)
    if mapfiles == []:
        print("No exist data map file in cos, please run lambda mapper first")
        return False
    elif len(mapfiles) < min_mapfiles:
        print("No enough map files in cos, at least %d map files can trigger shuffle process" % min_mapfiles)
        return False

    ## step 2. download mapper data from cos
    for mapfile in mapfiles:
        download_ret = download_file(cos, cos_mapdata_dir, mapfile, container_mapfile_path)
        if download_ret != 0:
            return False   

    # step 3. shuffle mapper input file
    ret = shuffle_data(container_base_path, container_mapfile_path, container_output_path, p0_thread_num, p1_thread_num, ai_bucket, sample_num)
    if not ret:
        print("shuffle data fail")
        return False

    # step 4. upload .hdf5 file to cos
    output_files = get_output_files(container_output_path)
    if len(output_files) == 0:
        print("No output results in *.hdf5")
        return False

    all_upload_ret = 0
    print(output_files)
    for output_file in output_files:
        upload_ret = upload_file(cos, container_output_path, output_file, cos_output_key)
        all_upload_ret += upload_ret
        if upload_ret != 0:
            print("Upload output file [%s] to cos failed" % output_file)
    if all_upload_ret != 0:
        return False

    ## clean up result files
    shutil.rmtree(container_output_path)
    return "Finish shuffle data"


def get_mapfiles(cos_client, bucket):
    status, ret_msg = cos_client.list_object(bucket)
    if str(status)[0] != '2':
        print("Get map data file error")
        return -1

    mapfiles = []
    root = ET.fromstring(ret_msg)
    for key in root.findall('Contents'):
        filename = key.find('Key').text
        if re.match(r'^mapdata/', filename):
            mapfiles.append(filename)
    return mapfiles

def shuffle_data(container_base_path, container_mapfile_path, container_output_path, p0_thread_num, p1_thread_num, ai_bucket, sample_num):
    try:
        CurPath = '/var/user'
        shuffle_tools = '/shuffle_all_tools/'
        if os.path.exists(container_base_path + shuffle_tools):
            shutil.rmtree(container_base_path + shuffle_tools)
        shutil.copytree(CurPath + shuffle_tools, container_base_path + shuffle_tools)

        os.chdir(container_base_path + shuffle_tools)
        cmd = 'sh king_shuffle_start.sh ' + container_mapfile_path + ' ' + p0_thread_num + ' ' + p1_thread_num + ' ' + container_output_path + ' ' + ai_bucket + ' ' + sample_num
        print cmd
        val = os.system(cmd)
        print val
        return True
    except:
        traceback.print_exc()
        return False

  在游戏AI训练数据预处理这个场景,我们从云函数获得的主要收益是快速实现数据预处理服务,避免AI工程师陷入到考虑计算分布化,容灾,扩容,服务器故障处理等平台性事项中,能够更专注于算法设计;另外AI计算资源耗费量巨大,云函数实现了资源真正按需分配,无需保留大批服务器造成资源浪费。

  在应用SCF无服务器云函数实践过程中,深刻体会到了其减少设计开发,运营维护工作量及在运营成本方面的优势,如果开发新的功能,云函数会成为我们团队的首选,作为团队架构师,应该承当好的一个责任是与时俱进的引入新生产力工具,持续推进团队开发运营效率提升及持续的追求成本优化,由于云函数在加速服务上线时间方面革命性的优势及按需使用计费的特点,它可能会比 docker 容器更快被广泛接受,谁能更快的拥抱云函数,谁便能更快的建立研发与运营的优势,欢迎大家试用腾讯云-SCF无服务器云函数,一起更好的迎接并促进无服务器时代的到来。

1. Q:云函数怎么和其它业务系统集成?

A:在腾讯云产品中,云函数已经和COS、CMQ、API gateway、日志等打通,可直接配置事件触发关系,另外用户在函数代码里,可自行实现与其它业务系统集成的代码,当前云函数直接可访问公网服务,马上可访问用户VPC里的服务。

2. Q:云函数实际应用中,和一般写法有什么不同,有什么缺点?

A:云函数当前支持python2.7, 3.6, node.js 6.10, Java 8等运行环境,可在本地开发编写代码上传,也可在云端直接编写,对比一般程序的写法,无须实现网络监听,故障容灾,扩容,日志监控等相关代码,极大的减少大家的代码开发量,缺点是调试不如本地方便,比如不能直接用GDB等工具单步调试。

3. Q: 腾讯SCF对于有状态服务是怎么滚动更新的扩容的?

A: SCF一般用来承载无状态的微服务,如果是有状态的实现滚动更新,需要把状态数据保存到CMQ, COS等持久化存储里。

4.Q:腾讯SCF对于容器扩容怎么做到不影响业务下扩容?

A: 腾讯SCF的函数调用由中控invoker模块统一发起,invoker模块知道每次函数调用在容器中的执行延时,执行结果等,且能判断容器是否空闲等;扩容容器时,完成内部函数运行时环境初始化后,才标记容器为空闲状态,可接收调用请求。

5. Q: 对云函数不是太懂,云函数与函数之间调用是通过http协议吗 还是rpc或者其他方式?

A: 函数之间调用采用http协议,这是业内cloud function的通用做法,内部模块之间使用rpc通信。

6. Q: 如果一个函数一个容器 那一个项目函数至少几万个吧 这样岂不是要部署上万个容器?

A: 函数被真实调用时,才会去分配容器,同时存在的容器数取决于有多少个函数正在被调用,调用的并发次数是多少,这是云函数的最大价值之一:避免资源闲置。

7.Q: 代码文件是通过dockerfile打包进容器的吗?这样构建会不会有点慢,像在线执行代码这类的,感觉都很及时。

A: 通过docker file打包成镜像再下载,确实耗时很长,所以实际运行代码没打包到镜像里,而是直接下发到母机,再将目录挂到容器里面。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
云函数原来还可以用来搞机器学习,厉害了
云函数原来还可以用来搞机器学习,厉害了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
云函数 SCF 与对象存储实现 WordCount 算法
本文将尝试通过 MapReduce 模型实现一个简单的 WordCount 算法,区别于传统使用 Hadoop 等大数据框架,本文使用云函数 SCF 与对象存储 COS 来实现。 MapReduce 在维基百科中的解释如下: MapReduce 是 Google 提出的一个软件架构,用于大规模数据集(大于 1TB)的并行运算。概念「Map(映射)」和「Reduce(归纳)」,及他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。 通过这段描述,我们知道,MapReduce 是面向大数
腾讯云serverless团队
2020/05/28
9290
使用腾讯云无服务器云函数(SCF)分析天气数据
无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service,函数即服务) 产品。其核心理念是让用户将重心放在业务的逻辑实现上,而不用关心底层的运维包括服务器、存储、网络、自动扩缩容、负载均衡、代码部署等问题。
李想
2018/01/09
5.3K0
使用腾讯云无服务器云函数(SCF)分析天气数据
使用 SCF 无服务器云函数定时备份数据库
最近有客户询问到使用云函数进行数据库导出备份时的一些问题,在此也进行一下总结,描述如何使用云函数来进行数据库备份。
腾讯云serverless团队
2018/07/10
10.2K0
使用云函数 SCF+COS 快速开发全栈应用
我一直想做一个网页应用,奈何没有系统学习过前端,直到后来我接触到腾讯云无服务器云函数 SCF,让前端可以快速获得后端的能力同时,一并解决了前端数据请求跨域的问题。 没错,云函数 SCF 就是那种一旦用了就无法回到原来那种神奇的东西,让人不禁感叹为什么没有早点遇到 SCF 然后我花了大概一天的时间编写调试上线发布云函数(应用后端),然后又用了一天的时间学了下前端,主要是确定要用到的技术栈(后面我会再讲到这个问题),然后第三天正式开始开发应用,将云函数引入前端调用,测试数据,调整布局,打包网页发布到 codi
腾讯云serverless团队
2020/06/09
1.1K1
​云函数实践(含代码):将日志服务的日志投递到自建 Kafka 的 3 个步骤
上文提到 将K8S日志采集到日志服务,这次介绍将采集的日志投递到自建 Kafka 中,用于 Spark 计算。
SRE扫地僧
2021/04/18
1K0
​云函数实践(含代码):将日志服务的日志投递到自建 Kafka 的 3 个步骤
云函数 SCF Node.js Runtime 最佳实践
腾讯云云函数最近新发布了 Node.js 12.16 的 runtime,也是国内首家支持 Node.js 12.x 的主流云服务商。
腾讯云serverless团队
2020/05/20
2K0
云函数 SCF 中 PHP 的一些入门坑
本文来自 Serverless 社区用户「逸笙」投稿 由于云函数 SCF 本身是用 bootstrap.php 来调用我们的入口函数,默认为 index.main\_handler,意思是调用 index.php 文件中的 main\_handler(),所以很多地方写法要有改变。php 一般提供网页服务,所以我主要讲API 网关配合的云函数 SCF。 main_handler(context)函数会传入 2 个参数,首先这 2 个参数是object,需要用->来访问子项,如 $event->{'head
腾讯云serverless团队
2020/07/03
1.1K0
使用腾讯云 SCF 云函数压缩 COS 对象存储文件
腾讯云serverless团队
2017/10/17
16.9K2
SCF: 深度学习之目标检测
很多小伙伴,可能在使用SCF的时候,需要做一些深度学习的操作,但是SCF能跑起来深度学习么?这是个问题!那么,我们就尝试一下,看看如何让SCF跑起来深度学习!
None-xiaomi
2019/06/12
11.6K0
COS结合SCF的数据复制实践
1.上传的数据目录不合适,但是现有代码调整需要发布,临时处理方法可以将A目录的数据复制一份到B目录。
wainsun
2020/12/19
1.1K0
COS结合SCF的数据复制实践
GitHub Actions + 腾讯云COS + SCF云函数 + 自动刷新CDN 完美自动化部署静态网站
作为强迫症患者,一直对自动化部署非常痴迷,个人认为全自动部署最重要的就是稳定可靠,经过研究测试,最终使用GitHub和腾讯云两大平台,成功完成了全自动部署网站的实践.
用户8851537
2021/07/30
1.5K0
基于SCF实现批量备份Elasticsearch索引到COS
在采用ELK架构的日志应用场景中,通常我们会按天或者按小时创建索引,从而避免单个索引的数据量太大。如果我们需要对过去一段时间的老索引进行冷备份,比如通过快照备份到S3或者腾讯云的对象存储服务COS中,然后降低索引的副本数量或者直接从ES删除索引,可以采取的方式有多种。一种是手动调用ES的API,一次性备份所有的老索引到COS中,但是如果数据量较大时只使用一个快照可能因为数据传输中断而导致快照执行失败;另外一种方式是自己编写脚本,通过crontab定时执行脚本对过去某一天或几天的索引打快照,执行成功后再对其它的索引打快照;本文尝试使用SCF(腾讯云无服务器云函数)对按小时新建的索引,持续批量的打快照到COS。
bellen
2020/07/24
7650
基于SCF实现批量备份Elasticsearch索引到COS
腾讯云函数挂载CFS文件系统的实践
在云函数开发的过程中,我们难免碰到需要访问本地文件的需求(例如:为了通过ip地址获得城市名称,云函数需要检索近一百MB的ip地址库文件),由于云函数无状态的特性,自身并不与特定服务器和本地硬盘关联,而远程访问COS对象存储等方式,则面临将大文件下载到本地缓存中仅获取寥寥数行信息。这时,挂载CFS文件系统是一个较佳的选择。
buzzfrog
2023/03/28
1.7K0
腾讯云发布无服务器云函数,较云主机成本低约70%
云资讯小编
2017/04/26
6.8K0
腾讯云发布无服务器云函数,较云主机成本低约70%
Serverless实践系列(八):如何优雅地给网站图片加水印
前言 很多论坛、博客在进行图片上传之后,都会给自己的图像加上水印,这样可以证明这张图片「属于我」或者是「来自我的博客/网站」。 传统的加水印的方法,通常是在流程内进行,即: 这种做法虽然可行,但是无疑会增加单次请求,服务端的压力,如果是高并发的情况下,或者多人上传多张大图的时候,那么可能就会造成自身服务器资源效果过大。 如果在加水印过程中失败,就有可能导致图像存储失败,致使数据丢失,并不理智。所以后来有人做了如下改进: 这样做法的好处就是 —— 我们可以快速将图片存储,存储之后通过一个单独处理的线
腾讯云serverless团队
2019/09/06
1.2K1
Serverless实践系列(八):如何优雅地给网站图片加水印
【scf】云函数层的理解和使用
云函数产品文档:https://cloud.tencent.com/product/scf
williamji
2022/10/09
1.7K1
基于云上scf的定时任务设计方法
腾讯云无服务器云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境。
洛杉矶
2019/02/26
10K1
基于云上scf的定时任务设计方法
SCF VS Code 实践:备份MySQL数据库至腾讯云COS
https://cloud.tencent.com/document/product/583/38090
孤鸿寄语
2019/10/03
1.6K0
SCF: 为您网站的图片加水印
很多论坛,很多博客在进行图片上传之后,都想着给自己的图像加上水印,这样可以证明这张图片“属于我”或者是“来自我的博客/网站”,那么传统的加水印的方法,通常是在流程内进行,即:
None-xiaomi
2019/06/03
1.3K0
基于SCF实现Elasticsearch的快照生命周期管理(SLM)
在ES 7.4版本后,我们拥有了SLM(快照生命周期管理)的功能,但是只有X-PACK商业版才能使用该功能,快照生命周期管理的实现也比较简单,实际上就是制定计划定时执行快照,我们可以通过编写脚本然后配置crontab任务来实现SLM。本文主要介绍如何利用腾讯云的SCF(云函数)来实现SLM并且结合ILM(索引生命周期管理)降低集群整体的分片数量和数据存储量,从而降低集群压力,减少存储成本。
bellen
2020/07/07
1.5K1
基于SCF实现Elasticsearch的快照生命周期管理(SLM)
推荐阅读
相关推荐
云函数 SCF 与对象存储实现 WordCount 算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验