给店里30台收银机做Chrome远程巡检,我用Cloud Run定时任务卡了预算
店里的收银机跑的是 Chrome 109,系统是 Windows 10 21H2,一共 30 台,分布在三个门店。上个月开始有人反馈收银页加载慢,我一开始以为是网络,后来发现是 Chrome 版本太老,有些前端接口不认。你让我一台一台去点,不现实,我就琢磨着做个远程巡检:每天定时查一遍每台机器的 Chrome 版本,低于 120 的列出来,我再决定要不要上门。
做法不复杂,我在 Cloud Run 上跑了一个小服务,入口就一个 GET /check,用 Cloud Scheduler 每天凌晨 1 点打一次。服务里读 Firestore 存的机器清单,每台机器上我提前装了一个很小的本地代理,端口 8765,返回 JSON,大概长这样:
{"chrome": "109.0.5414.120", "os": "10.0.19044", "ts": 1710000000}
Cloud Run 这边用 Node.js 写的,核心就几行:
const list = await db.collection('machines').get();
for (const doc of list.docs) {
const { ip } = doc.data();
try {
const r = await fetch(`http://${ip}:8765/version`, { signal: AbortSignal.timeout(4000) });
const j = await r.json();
if (compare(j.chrome, '120.0.0.0') < 0) {
await db.collection('alerts').add({ ip, chrome: j.chrome, at: new Date() });
}
} catch (e) {
await db.collection('alerts').add({ ip, error: e.message, at: new Date() });
}
}
为什么放 Cloud Run 不放自己店里那台旧服务器?我之前用店里机器跑过定时脚本,停电一次就断了三天,客户投诉我都不知道。Cloud Run 按请求计费,一天一次,30 台机器,一个月下来不到两块钱,比我守着强。代价是冷启动,第一次请求会慢两三秒,所以我把超时设成 4 秒,宁可报错也别挂着。
哪里会失效?我给你讲个我踩过的坑。有三个门店的机器在 NAT 后面,出口 IP 不固定,我一开始按 IP 白名单放行,结果第二天全红了。后来改成每台机器带一个 token,服务端只认 token 不认 IP,才稳住。还有就是 AbortSignal.timeout 在 Node 18 以下没有,我一开始用的老运行时,报错报得莫名其妙,换成 Node 20 才正常。另外 Firestore 免费额度每天读 5 万次,30 台机器一天读一次没问题,但你要是一分钟跑一次,那账单就不是两块钱的事了。
现在我每天早上看 alerts 集合,超过三台同版本落后就安排上门。你们那边收银机或者门店终端做批量巡检,是用现成的监控工具,还是像我这样自己搭个小服务?有没有更省事的法子,我听听。
0 条评论
还没有评论,写下第一条。