有没有啥办法能保证后端服务异步执行的数据在服务重启的时候不丢失

2023-10-12 19:01:38 +08:00
 NoKey
今天在写异步服务,基于 springboot 框架的
写着的时候,想起来一个事情
比如有个处理数据的异步逻辑,产生了一定量的异步任务
然后,这个时候服务重启了
异步执行里面的数据肯定就丢了
有啥办法能保证服务重启的时候,数据不丢呢?
如果线程池有队列,那么队列里面的也会全丢失
处理前先把未处理的数据存储了,然后处理后移除?
有没有比较好的策略呢?
谢谢。
1039 次点击
所在节点    Java
12 条回复
opengps
2023-10-12 19:06:55 +08:00
参考分布式锁的超时设计:
额外用一个消息队列或者第三方公共缓存服务,标记下某个任务进入正在处理状态,设定上一个安全合理的正常处理超时,真超时可能是丢失了,重新处理一遍就行
night98
2023-10-12 23:29:58 +08:00
上 mq ,不然自己实现更麻烦。或者加个类似 sqllite 的本地数据库。
lsk569937453
2023-10-13 09:09:01 +08:00
所以有了 mq 啊
bill110100
2023-10-13 10:37:38 +08:00
mq 记录任务,确定消费成功再从 mq 里去除。
NoKey
2023-10-13 11:08:45 +08:00
如果用 mq 的话,那么一个后台服务很多场景都会用到 mq 了,会不会很重啊
Aresxue
2023-10-13 11:41:44 +08:00
mq or 定时任务
mmdsun
2023-10-13 11:58:24 +08:00
任务调度框架? Spring Batch 、xxl-job 、PowerJob
hdfg159
2023-10-13 14:13:41 +08:00
消息队列
j1132888093
2023-10-13 17:37:55 +08:00
建个通用的任务表,处理完了标识一下
trzzzz
2023-10-13 22:57:31 +08:00
不想引入 mq ,就得找个地方存起来,存数据库,执行完更新下状态
heqingpan
2023-10-14 12:25:46 +08:00
一定要找个地方存起来才行,不然重启在内存的数据就没了。

可以用 mq 也可以用通用任务表(用完标记删除或物理删除都可以),特定场地存本地文件也可以。
40xEQBKvMvxaRO8y
257 天前
一个简单的处理办法,重启的时候指定所谓的优雅停止,也就是说不要 kill -9 ,kill -2 + sleep 10 秒,来让应用处理正在执行的任务同时停止外部新请求的进入,然后再加上单独的定时任务服务或者建个任务表定时扫描的形式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX