This topic created in 943 days ago, the information mentioned may be changed or developed.
今天在写异步服务,基于 springboot 框架的
写着的时候,想起来一个事情
比如有个处理数据的异步逻辑,产生了一定量的异步任务
然后,这个时候服务重启了
异步执行里面的数据肯定就丢了
有啥办法能保证服务重启的时候,数据不丢呢?
如果线程池有队列,那么队列里面的也会全丢失
处理前先把未处理的数据存储了,然后处理后移除?
有没有比较好的策略呢?
谢谢。
12 replies 2024-03-11 14:49:47 +08:00  | | 1 opengps Oct 12, 2023 参考分布式锁的超时设计: 额外用一个消息队列或者第三方公共缓存服务,标记下某个任务进入正在处理状态,设定上一个安全合理的正常处理超时,真超时可能是丢失了,重新处理一遍就行 |
 | | 2 night98 Oct 12, 2023 上 mq ,不然自己实现更麻烦。或者加个类似 sqllite 的本地数据库。 |
 | | 4 bill110100 Oct 13, 2023 mq 记录任务,确定消费成功再从 mq 里去除。 |
 | | 5 NoKey Oct 13, 2023 如果用 mq 的话,那么一个后台服务很多场景都会用到 mq 了,会不会很重啊 |
 | | 7 mmdsun Oct 13, 2023 任务调度框架? Spring Batch 、xxl-job 、PowerJob |
 | | 10 trzzzz Oct 13, 2023 不想引入 mq ,就得找个地方存起来,存数据库,执行完更新下状态 |
 | | 11 heqingpan Oct 14, 2023 via Android 一定要找个地方存起来才行,不然重启在内存的数据就没了。
可以用 mq 也可以用通用任务表(用完标记删除或物理删除都可以),特定场地存本地文件也可以。 |
 | | 12 40xEQBKvMvxaRO8y Mar 11, 2024 一个简单的处理办法,重启的时候指定所谓的优雅停止,也就是说不要 kill -9 ,kill -2 + sleep 10 秒,来让应用处理正在执行的任务同时停止外部新请求的进入,然后再加上单独的定时任务服务或者建个任务表定时扫描的形式 |