跳至正文

解决方案 · 机器人

适用于 Telegram 机器人的 VPS

机器人空闲时占用不到一百兆字节,大部分时间都在等待,因此机器几乎从不是瓶颈:每月 $6.90 的 U1-1 就能稳定运行一个机器人。真正决定费用的是媒体文件,以及您是否自建 Bot API 服务器。两者都只是简单的计算,详见下文。

决定背后的决定

Webhook 还是长轮询

决定您的机器人是否需要域名、证书和开放端口的是这一点,而不是套餐。

长轮询

您的机器人主动连接 Telegram 并等待更新。不需要域名、不需要 TLS 证书、不需要对互联网开放端口,可在 NAT 之后运行。这是最快让程序跑起来的方式,对大多数机器人而言也是完全可以长期使用的方案。

Webhook

由 Telegram 连接到您。需要公网地址、有效证书和开放端口(这里任何套餐都能满足),作为交换,没有轮询循环,在真实负载下扩展性更好。等负载或延迟提出要求时再切换,不要提前。

算一笔账

一个套餐实际可容纳多少机器人

机器人数量 = (RAM − 操作系统占用的 300 MB) ÷ 单个机器人占用的内存。两列分别对应无状态命令机器人,以及带有 ORM、调度器和缓存的机器人。

各套餐可运行的机器人进程数量与每月流量额度,附实时价格
套餐RAM轻度机器人重度机器人流量价格部署
U1-1一个机器人,用户规模不限1 GB124不计流量$6.90部署
C1-1-25一个机器人,计流量但便宜1 GB1241 TB$9.90部署
GL2-4多个机器人,或带数据库的机器人4 GB6325不计流量$11.90部署
BD-8自建 Bot API 服务器8 GB1315232 TB$12.90部署

您的机器人有多少用户并不在这笔账里,因为它本就不是问题所在:Telegram 将更新逐条交给您的进程,而不是为每个用户打开一个连接。真正改变答案的是您自己持有的状态:大型缓存、进程内数据库、模型。

决定账单的数字

瓶颈是媒体,不是内存

平均文件大小 × 每天消息数 × 30。双向都计入:接收的文件同样算流量。

按消息类型统计的每月流量:每天一百条、五千条和五万条消息
机器人传输的内容100/天5,000/天50,000/天
纯文本一条命令和一条回复。几乎没有成本。< 1 GB< 1 GB3 GB
图片一张压缩图片,发送和接收各一次。< 1 GB44 GB439 GB
语音消息和短视频社区机器人的常见负载。9 GB439 GB4.3 TB
文档和长视频Telegram 自身对普通机器人的下载上限。59 GB2.9 TB28.6 TB

唯一改变机器选择的因素

使用公共 Bot API 的机器人最多可下载 20 MB、上传 50 MB 的文件(这是 Telegram 的限制,不是我们的),且文件不会经过您的磁盘。自建 Bot API 服务器后,上限变为 2 GB,每个文件都会落到您的服务器上。到了这一步,磁盘和流量就不再是次要问题:BD-8 以 $12.90 提供 100 GB SSD 和 32 TB 流量,正是适合的配置。如果您不这样做,就无需为此付费。

说实话

我们实际会买哪台

我们自己也在运行 Telegram 机器人。这就是我们会选用的机器。

单个机器人

U1-1 · $6.90/月

1 核、1 GB、15 GB SSD,且不计流量:即使机器人意外开始传输媒体,也不会产生意料之外的账单。用 systemd 托管机器人并设置 Restart=always,剩下唯一可能让它宕掉的就是您自己的代码。如果不够用了,迁移机器人只需复制一个目录和一个 token。

常见问题

购买前大家常问的问题。

Telegram 机器人需要多少 RAM?
远低于通常的宣传。机器人是一个长期运行、几乎所有时间都在等待的进程:无状态命令机器人约占 60 MB,带有 ORM、调度器和缓存的机器人接近 150 MB。操作系统占用约 300 MB 后,一台 1 GB 的机器仍可容纳 4 个重度机器人或 12 个轻度机器人。用户数量几乎不影响结果,因为 Telegram 是将更新逐条推送给您的进程,而不是为每个用户建立一个连接。真正会改变结果的,是您自己保存在内存中的状态:大型缓存、进程内数据库或模型。
Webhook 还是长轮询?
先用长轮询,真正需要时再用 webhook。使用长轮询时,您的机器人主动向 Telegram 建立连接并等待:它不需要域名、不需要证书、也不需要开放端口,因此可以在 NAT 之后运行,是最快让程序跑起来的方式。webhook 则由 Telegram 连接到您,因此需要公网地址、有效的 TLS 证书以及一个对互联网开放的端口;作为交换,它完全省去了轮询循环,在机器人确实繁忙时扩展性更好。两种方式在这里最小的机器上都能正常运行。真正值得切换的理由是负载或延迟,而不是潮流。
文件大小限制是多少?
这是 Telegram 自身的限制,不是我们的:使用公共 Bot API 的机器人最多可下载 20 MB 的文件、上传 50 MB 的文件。自行运行 Bot API 服务器可将上限提高到 2 GB,更重要的是,文件会落在您服务器的磁盘上,而不是经由 Telegram 的服务器中转。这是唯一真正改变您所需机器的因素:磁盘和流量突然变得重要,这也是上表把 BD-8 放在这一行、而不是其他行的原因。
带宽会不会用完?
文本机器人,永远不会。媒体机器人则有可能,值得花三十秒算一算:平均文件大小 × 每日消息数 × 30。每天五万条 3 MB 的语音消息,每月约 4.3 TB,超出了大多数廉价套餐的流量额度,但远低于 BD-8 的 32 TB,更不用说不计流量产品线,在那里根本不存在这个问题。双向都计入:机器人接收的文件和发送的文件都算流量。
关闭终端后如何让机器人继续运行?
使用 systemd 单元,而不是 screen 会话。编写一个带 Restart=always 的小型服务文件并启用它,机器人在崩溃和重启后都会自动恢复,无需您守着。这是机器人在 VPS 上"挂掉"最常见的原因,而且并非主机问题:手动启动的进程会随启动它的 SSH 会话一同结束。如果您更想用容器打包,带重启策略的 Docker 也能起到同样的作用。
一台服务器上可以运行多个机器人吗?
可以,而且大多数人都应该这样做。每个机器人都是独立的进程,有各自的 systemd 单元和各自的 token;它们共享这台机器,如您愿意也可共享数据库,此外互不相干。表中的算账正是回答这个问题:一台 4 GB 的机器可容纳 25 个重负载机器人,之后内存才会成为瓶颈。如果它们分属不同的人,请使用不同的端口和不同的用户。
机器人应该运行在哪个区域?
任何您的用户能够访问、且到 Telegram 的延迟合理的地方都可以。机器人与 Telegram 的基础设施通信,而不是直接与您的用户通信,因此通常的“靠近受众”原则在这里不如网站那样重要。如果机器人还要为这些用户提供 Web 控制面板或 API,请改为按这一需求选择区域。如果拿不准,可以在两个区域按小时计费部署,实测后销毁表现较差的那台:每小时 $0.0113,这个试验成本很低。