V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zfish
V2EX  ›  程序员

无服务(Serverless)应用开发体验

  •  3
     
  •   zfish ·
    madawei2699 · 2020-08-31 08:42:39 +08:00 · 9589 次点击
    这是一个创建于 1305 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文描述了笔者开发一个基于 AWS Serverless 技术的应用的全过程。基础设施使用 Serverless Framework 和 Terraform 搭建。系统的核心模块是每天都会执行一次的定时任务:该任务通过 Tushare 获取一组 ETF 指数基金价格数据,处理之后会将交易信号生成文本存放至 S3 桶。之后会发送消息给 AWS SNS Topic,订阅该主题的用户会收到邮件提醒。在系统的 Web 页面里有用户邮件订阅入口,也可以访问每天的历史交易信号记录。

    原文地址: 《 Serverless 应用开发小记》

    技术栈:

    架构图:

    第 1 条附言  ·  2020-08-31 10:30:02 +08:00
    架构图是 plantUML 导入 C4 和 aws 图标包绘制的,具体源码见: https://github.com/bmpi-dev/bmpi.dev/blob/master/content/dev/guide-to-serverless/arch_aws.plantuml
    45 条回复    2021-01-05 13:39:18 +08:00
    whileFalse
        1
    whileFalse  
       2020-08-31 09:18:11 +08:00
    架构图很漂亮。

    问句跑题的,技术选型时使用 Terraform/Serverless Framework,而不是其他框架(比如 SAM 、CDK )是什么考虑呢?
    比如我的公司使用该技术 /有跨云跨提供商需求或不希望被云绑定 /该框架对新用户更友好
    zfish
        2
    zfish  
    OP
       2020-08-31 09:40:36 +08:00 via iPhone
    @whileFalse 没有啥特别的原因,主要是我目前只熟悉这两个,还没用过你提到的这些。
    zfish
        3
    zfish  
    OP
       2020-08-31 09:41:20 +08:00 via iPhone
    @zfish tf 和 sls 也可以跨云的,不知道你指的跨云具体是啥
    whileFalse
        4
    whileFalse  
       2020-08-31 09:56:03 +08:00
    @zfish 我说的这两个是 AWS 自己的框架,不支持跨云

    我在考虑要不要学一下 Terraform/Serverless 之类的框架,所以问一下这些框架的应用场景。
    主要是我目前没有跨云的需求,不确定这些框架除了跨云之外还有什么优势。
    kenshinhu
        5
    kenshinhu  
       2020-08-31 10:05:34 +08:00
    这个会否类似 国内的 leancloud 方案?
    dk7952638
        6
    dk7952638  
       2020-08-31 10:06:07 +08:00   ❤️ 1
    Serverless 的厂商绑定确实是个很大的风险,有没有成熟的中间层框架或者跨平台的方案没?
    threebr
        7
    threebr  
       2020-08-31 10:08:45 +08:00
    请问架构图是用什么软件画的?
    tflz514
        8
    tflz514  
       2020-08-31 10:11:54 +08:00
    歪个楼,架构图用什么工具画的?
    Tumblr
        9
    Tumblr  
       2020-08-31 10:11:56 +08:00
    对标题略懵。。。是「无服务」开发还是「无服务器」开发?
    多年来一直把 server-less 翻译为 「无服务器」的我……开始了对自己的怀疑。

    anyway,感觉蛮棒的,尤其是原文。
    eason1874
        10
    eason1874  
       2020-08-31 10:12:36 +08:00
    就我的体验来说,Serverless 在应用上除了响应时间慢点,啥都好,就是贵,用不起。
    zfish
        11
    zfish  
    OP
       2020-08-31 10:28:20 +08:00   ❤️ 1
    @whileFalse sls 和 tf 都可以跨云,具体你可以看看他们的文档,sls 的跨云就是理念一致,写法还是没法复用,类似 react native 这种开发体验
    zfish
        12
    zfish  
    OP
       2020-08-31 10:28:42 +08:00
    @kenshinhu leancloud 不算吧,差异还是很大的
    zfish
        13
    zfish  
    OP
       2020-08-31 10:30:36 +08:00
    @eason1874 也挺便宜的,主打的不就是按需付费么,如果流量小,其实很便宜
    Muninn
        14
    Muninn  
       2020-08-31 10:48:01 +08:00   ❤️ 1
    我最近一个项目也用的 aws serverless 全套。用下来的感想,它不是很易用,不敏捷,不完善,遇到很多问题。DynamoDB 反人类。

    项目小了它麻烦,项目大了它贵。

    招不到会这个的人。

    估计就 Node 全栈的人玩玩还行。

    下个项目还是继续 golang + react 香。
    ysc3839
        15
    ysc3839  
       2020-08-31 10:53:54 +08:00 via Android   ❤️ 1
    @dk7952638 我前段时间做过调查,大部分 Serverless 平台都支持 Node.js ,然后许多平台 http 请求的接口是用 Node.js 标准的 req res,可以直接配合 express 。少数使用私有接口的比如 AWS 也有对应的 wrapper 。
    zfish
        16
    zfish  
    OP
       2020-08-31 10:56:00 +08:00
    @Muninn 易用性还有待提升,我感觉它 vpc 和 IAM 都很复杂,估计以后会变得易用吧,现在也只是尝试,体验还行,个人项目做不错,费用也便宜
    th00000
        17
    th00000  
       2020-08-31 11:03:28 +08:00
    @Muninn #14 DynamoDb 深度用户, 我觉得不光不反人类, 简直就是人类的福音
    zherrrrrrrr
        18
    zherrrrrrrr  
       2020-08-31 11:12:22 +08:00
    您的资料整理真全,aws 来公司给介绍过 serverless,吸收的不多,但确实是很不错,替代服务器是趋势。
    hillwall
        19
    hillwall  
       2020-08-31 12:05:01 +08:00
    DynamoDB 反人类+1,用得太痛苦
    594duck
        20
    594duck  
       2020-08-31 12:12:26 +08:00
    serverless 动不动几百 ms 的延迟用的也好?而且服务栈用的太复杂了。
    tonyaiken
        21
    tonyaiken  
       2020-08-31 12:18:30 +08:00 via iPhone
    @Tumblr 应该是无服务器
    zfish
        22
    zfish  
    OP
       2020-08-31 12:40:12 +08:00 via iPhone
    @594duck 预热后延迟不高,也就冷启动时慢一些
    zfish
        23
    zfish  
    OP
       2020-08-31 12:42:19 +08:00 via iPhone
    @Tumblr 应该是无服务器,无服务有点怪。。可能受微服务的影响,不过那是 service,这是 server
    mineqiqi
        24
    mineqiqi  
       2020-08-31 14:43:16 +08:00
    没用过,来看看
    yiyi11
        25
    yiyi11  
       2020-08-31 16:11:41 +08:00 via Android
    @Tumblr 无服务器,不是不用服务器了,是编码过程中不再关注服务器环境了。
    winglight2016
        26
    winglight2016  
       2020-08-31 17:37:29 +08:00
    @Muninn aws 这一套真的是反人类,尤其是 dynamodb,而且完全没有迁出的可能性,之前公司也就是因为 amazon 送了几千刀的券,不用白不用,不然根本不可能选这套框架。
    zfish
        27
    zfish  
    OP
       2020-08-31 20:29:16 +08:00 via iPhone
    @winglight2016 用 aws rds 和 ecs 也行,当然 lambda 只能和云服务商捆绑起来
    winglight2016
        28
    winglight2016  
       2020-09-01 10:04:18 +08:00
    @zfish 不是在讨论 serverless 吗?你全部在 VPS 实例中实现 serverless 比普通架构有啥特别的优势吗?
    zfish
        29
    zfish  
    OP
       2020-09-01 12:08:18 +08:00 via iPhone
    @winglight2016 可以用云提供的其他能力,扩展性更好,不需要你再重新搞一些底层的组件了
    viakiba
        30
    viakiba  
       2021-01-05 08:08:57 +08:00 via iPhone
    @whileFalse serverless 好像是有标准的 没用过不懂
    zjsxwc
        31
    zjsxwc  
       2021-01-05 08:38:34 +08:00
    serverless == no server ?
    少服务 == 无服务 ?
    musi
        32
    musi  
       2021-01-05 08:56:39 +08:00 via iPhone
    架构图是用什么工具画的
    lihongming
        33
    lihongming  
       2021-01-05 08:59:06 +08:00 via iPhone
    @winglight2016 我也算个 DynamoDB 深度用户。你说它难以迁出我同意,但你说它难用……我怀疑你可能在用其他数据库的思路用 DynamoDB,或者说你被你的经验坑了。

    DynamoDB 最大的特性是什么?快!所以你的设计必须围绕这个特性,把传统设计中的复杂单次查询拆分为一系列并发的简单查询,简单到初学者不用动脑子也会的那种就对了。

    都这么简单了,还能说它难用吗?
    rogwan
        34
    rogwan  
       2021-01-05 09:04:24 +08:00 via Android
    云服务器本质上也就是:虚拟机 as service,除非一些特型功能用 serverless,通用功能还是自建可用性好。
    wangxiaoaer
        35
    wangxiaoaer  
       2021-01-05 09:07:17 +08:00
    问一下,都用上容器了,还是无服务器? 这跟直接基于厂商的容器环境如 k8s 有啥优势?
    DiamondYuan
        36
    DiamondYuan  
       2021-01-05 09:19:00 +08:00 via iPhone
    我们前端构建用的也是 serverless 很爽
    ljpCN
        37
    ljpCN  
       2021-01-05 09:26:12 +08:00
    楼上各位对 serverless 概念有所怀疑的,这篇文章包含了搭建 serverless 环境的过程,所以必然不是那么开箱即用的 serverless 。而且涉及的 docker 也是不需要自己配置服务器去部署,aws 的 Fargate 你只需要跟容器打交道就行了。如果你直接使用商家提供的 serverless 资源,那你只要写云函数就行了,不用跟配置这些计算资源打交道。
    zfish
        38
    zfish  
    OP
       2021-01-05 10:30:37 +08:00 via iPhone
    @ljpCN 是的,主要是加入了 serverless 的一些配置框架,这些框架可以让你更为容易的迁移不同的云服务商,如果只是基于 aws 那更简单了
    photon006
        39
    photon006  
       2021-01-05 11:13:24 +08:00
    我们公司也在用 aws serverless lambda 这一套,dynamodb 真的反人类,虽然跟 mongodb 都是文档类型 db 但差别真的很大,尤其是细节上
    1 、query 、scan 最大返回结果 1M,很多时候得自己用代码写递归从全表查询数据
    2 、排序要加全局二级索引( GSI ),额外收费$3.86 / month
    3 、添加了 GSI,scan 不支持排序,换 query,query 的条件对比又没有 scan 多
    4 、分页往后翻还好,向前翻页还得自己维护一套页码

    mysql 、mongodb 做一个单表排序筛选分页的基本功能分分钟完事,dynamodb 半天、一天。。。

    以上吐槽有可能是我学艺不精没 get 到它的精髓,总体体验就是太浪费时间,相当折腾。
    zfish
        40
    zfish  
    OP
       2021-01-05 11:33:07 +08:00 via iPhone
    @photon006 所以我自己搞了一套在 EC2 一键部署 PG 数据库的代码: https://github.com/bmpi-dev/invest-assistant/tree/master/IaC/aws/db
    hantsy
        41
    hantsy  
       2021-01-05 11:58:28 +08:00
    AWS 官方有一个 Cafe 的例子 lambda 不错。
    hantsy
        42
    hantsy  
       2021-01-05 11:59:20 +08:00
    dynamodb 是个多引擎的,这种奇葩越来越多。
    hantsy
        43
    hantsy  
       2021-01-05 12:44:05 +08:00
    @zjsxwc @yiyi11

    完全不是。severless 有云平台,一样需要环境支持。

    说白了,以前你的程序比如跑 Tomcat,需要 Tomcat 长期运行。

    现在你写的程序变成像普通 Java Aplication 一样或者本地的 Bash 命令一样,执行一次,需要启动,执行,停止,释放资源等步骤,它需要一个云 Severless 平台(一个大容器)支持。

    有些场景感觉不适合,比较我们通常的数据库操作,长期运行的 Tomcat 服务器,有缓存,Pool 机制。用 Severless 方式感觉成本更高。

    目前各平台打架很厉害。Severles 基本是云的产物,脱离不了云。
    caoyouming
        44
    caoyouming  
       2021-01-05 13:17:00 +08:00
    自己 k8s 搞起来,在 k8s 基础上做 serverless 不就可以了
    zfish
        45
    zfish  
    OP
       2021-01-05 13:39:18 +08:00 via iPhone
    @hantsy 长期运行不如用 EC2 服务器,serverless 适合做一些简单的业务,尤其是中小型系统在流量不大的时候成本会很便宜,弹性扩容,如果流量非常高那不如用专用服务器
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3223 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:01 · PVG 20:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.