接口是通的,工人已经停了四十分钟
今早导入的发票一直停在「排队」。order-api 的健康检查是绿的,页面也能打开。队列长度从 7:12 开始涨,没人收到报警,因为报警看的是接口错误率,错误率是 0。请求只负责把任务丢进 Redis,丢成功就算成功。
工人是同一个进程里的一个循环,不是单独的部署。循环里有个没抓住的异常:处理到一张附件名字为空的发票时,抛了 Cannot read properties of undefined。异常把循环打停了,HTTP 服务还在。进程没退出,systemd 也不会拉起。从停到我重启,大约 43 分钟,积了 200 多条任务。
重启之后工人把积压消费完了。那张附件为空的发票我改成跳过并记 warn,不让它再把循环打死。这只是这一次的数据。下次换一种异常,还是会停。
健康检查不能只打 /health。我加了一个其实很笨的判断:工人每处理完一条就写当前时间到 Redis,键过期 30 秒;健康检查读这个时间,超过 30 秒没有更新就返回 500。另外队列长度超过 100 发报警。这两个今天都上了。
进程内跑工人本来就容易变成这样。拆成单独进程要改部署,这周来不及。先让「人还在、活没干」能被看见。