我有一个程序实时监视steem区块链上的一切操作,其中一项功能是处理帖子,经过简单过滤后,如果帖子符合条件,我会开启一个新线程对其进行进一步操作。
(图源 :pixabay)
可是程序跑起来突然一天发现漏掉一些帖子,我就死活想不明白为啥会漏掉呢。为了判断原因,我在程序中加了一些输出信息,比如说第一遍过滤的时候,记录最终通过筛选的帖子,第二遍处理时,记录每个操作步骤。
然后我判断明白了,是在第二遍处理时,程序判断帖子被编辑了,所以丢掉不去处理。这所以这样做,是因为同一个帖子我处理一遍就可以了,所以我只处理最原始的第一个帖子。
但是问题来了,既然我处理了原始的帖子,可是为什么还会被漏掉,还是显示原因是因为编辑导致帖子被丢弃呢?
我想啊想啊,最后终于想明白了,从我监控到新帖子开始进行筛选,到线程里判断帖子是否被编辑,此处有个短短的时间差,尤其是节点响应慢或者不稳定时,这个时间差显著加大,有可能长达2-3秒,而一旦用户在这两三秒内编辑了帖子,那么我线程中再去判断,帖子就的状态就变成了已编辑。
这就是问题的根源,也就是说如果用户不再发帖后2-3秒内马上编辑,或者steem API的节点足够稳定响应迅速,都不会发生这样的问题,可是它却确确实实地发生了。
(图源 :pexels.com)
看来我考虑问题还是不周啊,还好这是并不重要的STEEM程序,如果让我做导弹或者火箭啥的,出这样的问题会不会把友军炸了?现在想想,当年没去战略导弹部队还是很明智的,哈哈。