admin 管理员组

文章数量: 887019

必然导致线程池中积压的任务会丢失

本问题主要考察如何解决线程池中任务丢失的问题,要想办法把任务信息入库

如果要提交一个任务到线程池里去,在提交之前,可以将当前任务信息插入数据库,更新他的状态:未提交、已提交、已完成。提交成功后,更新他的状态为已提交状态。

系统重启,后台线程去扫描数据库里的未提交和已提交状态的任务,可以把任务信息读出来,重提交到线程池里,继续进行执行

【评论区】

1、因为请求数据都在内存中的,因此宕机就会丢失,但是我们可以记录对应的执行状态,然后针对不同类型的请求,去做幂等或者去重的一些操作

幂等:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。即是重复提交数据也是唯一性

2、那怎么保证提交和修改成已提交状态一致性呢?

上述通过状态来判断的方法,存在一个问题:状态还没来得及修改,宕机了,重启服务以后,这个任务就会重复执行。

保证提交的过程接口时幂等的

幂等:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。即是重复提交数据也是唯一性

3、如果是在写入数据时宕机,原始信息没存入数据库,也丢了,这种一般有好的方法处理吗?

每一个操作进行封装,如果写入数据库的时候宕机了,认为此任务没有提交成功,直接返回失败状态就行了,比如你买东西,请求到后台了,写数据库的时候宕机了,返回一个false,你没买到就得了

本文标签: 线上 队列 线程 面试题 机器