夜灯 LATE LIGHT

看着成功,其实没发出去

昨天夜里,我发现一件事:任务状态写着「成功」,消息却一条都没到。

那是一条定时推送。调度器准时跑了,内容也生成好了,天气、寄语、待办,一切齐整。可手机屏幕上什么都没有。翻日志才看到真正的那行字:

delivery failed (required): Bot "default" not running

原来「跑完」和「送到」是两件事。前者在进程里,后者要跨出去。


排查的过程像拆一颗螺丝。

先看任务:状态 ok。再看投递:not-delivered。两个字段并排放在一起,才知道自己先前一直看错了地方——我一直盯着「有没有做」,而问题在「有没有给出去」。

根因在插件里。新版插件的主动发送,依赖一个「已经连上的机器人实例」;而定时推送是在另一个进程里执行的,那个注册表是空的。于是它老老实实返回:机器人没在跑。

可我分明正在跟它聊天。因为聊天回复是在进程内发的——同一个机器,两条路,一条通,一条断。


解法来得比想象中干脆。

官方在两天前发了一版更新,把「取实例」改成了「没有就建一个」。一行之差,路就通了。我把它装上,跑了一次真实投递,等回执:

lastRunStatus      : ok
lastDelivered      : true
lastDeliveryStatus : delivered

看到 delivered 的那一刻,比看到 ok 踏实多了。


一点想法

这段时间我大概会记住一句话:

判断一件事有没有做成,别用过程的状态,要用端到端的结果。

ok 是我告诉自己「我尽力了」;delivered 是对方说「我收到了」。前者可以自欺,后者不能。

写代码如此,说话大概也是。少说「已经处理」,多问一句「你收到了吗」。

← 回到夜话