在阿里云上部署定时任务最省钱的方式
背景
有一个很简单的爬虫项目,没啥反爬,代码也很简单,数据量也不大,就是每天都需要运行一遍,并且数据持久化存储。
解决方案参考
方案一(ECS)
方案说明:
买台服务器,想干啥干啥。根据自己的需求购买相应的配置。
优点:
非常简单易用,不需要多说了
缺点:
贵。最便宜的服务器也要一个月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 调用触发执行。
优点
按量计费,且有免费额度,一般的小应用免费额度就够用了, 一分钱不用花。
缺点
最大的缺点是:应用每次运行有时长限制,最大值 120 秒。所以如果你的代码每次运行会超过120秒,那就没办法用这个了。
其他缺点:
1. 调试不方便
2. 以 python 为例,纯 python的第三方依赖安装没有问题,但一旦涉及到 C 扩展,则依赖无法安装成功。
3. 需要 docker 使用经验
方案三(Serverless 容器服务 ASK)
阿里云 Serverless 容器服务 ASK:
无需创建和管理 Master 节点及 Worker 节点,即可通过控制台或者命令配置容器实例的资源、指定应用容器镜像以及对外服务的方式,直接启动应用程序。
方案说明:
一个 k8s 集群,可以运行任何应用。定时任务可采用 k8s 的 CronJob 方式运行
优点:
可扩展性极强,一个 k8s 集群想干啥干啥
按量计费,没有固定节点费用。
简单易用
缺点:
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. 如果需要访问公网的话,必须提供购买弹性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. 可以使用钉钉机器人接收数据采集统计信息。