在阿里云上部署定时任务最省钱的方式

背景

有一个很简单的爬虫项目,没啥反爬,代码也很简单,数据量也不大,就是每天都需要运行一遍,并且数据持久化存储。

解决方案参考

方案一(ECS)

阿里云 ECS:https://help.aliyun.com/document_detail/25398.html

方案说明:
买台服务器,想干啥干啥。根据自己的需求购买相应的配置。

优点:

  1. 非常简单易用,不需要多说了

缺点:

  1. 贵。最便宜的服务器也要一个月30+。

方案二(函数计算)

白嫖阿里云函数计算的免费额度:https://help.aliyun.com/document_detail/54301.html

  • 调用次数:每月前100万次函数调用免费。
  • 函数实例资源使用量:每月前400,000 GB-秒函数实例资源使用量免费。

方案说明:
代码部署有两种方式:

  1. 使用阿里云提供的函数计算环境来部署,阿里云提供了 python、node、php、java、go等运行时环境。详见文档:https://help.aliyun.com/document_detail/73338.html。
  2. 使用自定义的 docker 镜像提供服务
    推荐使用第 2 种方式,第一种方式仅适合非常简单的应用。因为运行时环境版本是固定的,而且依赖安装起来有不少问题。
    代码部署完成后,如果是定时任务,可选用定时器触发执行。其他类型,可选用 http 调用触发执行。

优点

  1. 按量计费,且有免费额度,一般的小应用免费额度就够用了, 一分钱不用花。

缺点

  1. 最大的缺点是:应用每次运行有时长限制,最大值 120 秒。所以如果你的代码每次运行会超过120秒,那就没办法用这个了。
  2. 调试不方便
  3. 以 python 为例,纯 python的第三方依赖安装没有问题,但一旦涉及到 C 扩展,则依赖无法安装成功。
  4. 需要 docker 使用经验

方案三(Serverless 容器服务 ASK

阿里云 Serverless 容器服务 ASK:

无需创建和管理 Master 节点及 Worker 节点,即可通过控制台或者命令配置容器实例的资源、指定应用容器镜像以及对外服务的方式,直接启动应用程序。

方案说明:
一个 k8s 集群,可以运行任何应用。定时任务可采用 k8s 的 CronJob 方式运行

优点:

  1. 可扩展性极强,一个 k8s 集群想干啥干啥
  2. 按量计费,没有固定节点费用。
  3. 简单易用

缺点:

  1. k8s 集群必须创建一个负载均衡用来提供k8s api服务。最低配的费用 72 元/月
  2. 如果你的应用需要访问公网,必须配置一个 NAT 网关。最低配的费用 165 元/月
  3. 需要 k8s 使用经验

方案四(Serverless 应用引擎 SAE

阿里云 Serverless 应用引擎 SAE:https://help.aliyun.com/document_detail/96732.html

  • CPU 0.0030864元/分钟/Core
  • 内存 0.0007716元/分钟/GiB

方案说明:

  1. 使用自定义 docker 镜像部署一个应用
  2. 设置定时启停规则

优点:

  1. 部署简单
  2. 按量计费
  3. 可以使用钉钉机器人接收应用启动和停止通知。

缺点:

  1. 只能使用定时的方式启动和停止应用,所以需要预估应用运行时间,避免造成不必要的时间浪费或者提前被停止
  2. 如果需要访问公网的话,必须提供购买弹性IP。按量付费的话:配置费用 14 元/月, 流量费用 0.8 元/G
  3. 需要提前预估应用耗费的 CPU 和 内存用来选择规格。

我的选择

方案四(Serverless 应用引擎 SAE)

  1. 爬虫代码运行时间是会超过120秒的
  2. k8s 太贵了,而且我也用不到那么多复杂的功能。
  3. ECS 也太贵了

具体实行方案:

  1. 代码打包成 docker 镜像,docker 镜像托管使用阿里云的容器镜像服务,个人版是免费的,而且同属内网,也会加快镜像拉取速度。
  2. 注意启动命令应该是先运行代码,然后阻塞住。如果不阻塞的话,容器在运行完代码后会退出,那么 SAE 服务会自动重启容器,然后你的代码就会再次运行,如此周而复始。。。
  3. 配置 SAE 时不需要选择健康探测,也不需要在容器里启动 HTTP 服务。
  4. 很重要的一个是数据持久化存储,我选择使用 OSS 服务,将采集后的数据存入 SQLite 数据库, 然后将数据库上传到 OSS 进行持久化存储。
  5. 每次修改代码只需要在本地打包成 docker 镜像,然后上传镜像即可。
  6. 可以使用钉钉机器人接收数据采集统计信息。