V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NoKey
V2EX  ›  Java

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

  •  
  •   NoKey · 187 天前 · 799 次点击
    这是一个创建于 187 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天在写异步服务,基于 springboot 框架的
    写着的时候,想起来一个事情
    比如有个处理数据的异步逻辑,产生了一定量的异步任务
    然后,这个时候服务重启了
    异步执行里面的数据肯定就丢了
    有啥办法能保证服务重启的时候,数据不丢呢?
    如果线程池有队列,那么队列里面的也会全丢失
    处理前先把未处理的数据存储了,然后处理后移除?
    有没有比较好的策略呢?
    谢谢。
    12 条回复    2024-03-11 14:49:47 +08:00
    opengps
        1
    opengps  
       186 天前
    参考分布式锁的超时设计:
    额外用一个消息队列或者第三方公共缓存服务,标记下某个任务进入正在处理状态,设定上一个安全合理的正常处理超时,真超时可能是丢失了,重新处理一遍就行
    night98
        2
    night98  
       186 天前
    上 mq ,不然自己实现更麻烦。或者加个类似 sqllite 的本地数据库。
    lsk569937453
        3
    lsk569937453  
       186 天前
    所以有了 mq 啊
    bill110100
        4
    bill110100  
       186 天前
    mq 记录任务,确定消费成功再从 mq 里去除。
    NoKey
        5
    NoKey  
    OP
       186 天前
    如果用 mq 的话,那么一个后台服务很多场景都会用到 mq 了,会不会很重啊
    Aresxue
        6
    Aresxue  
       186 天前
    mq or 定时任务
    mmdsun
        7
    mmdsun  
       186 天前
    任务调度框架? Spring Batch 、xxl-job 、PowerJob
    hdfg159
        8
    hdfg159  
       186 天前
    消息队列
    j1132888093
        9
    j1132888093  
       186 天前
    建个通用的任务表,处理完了标识一下
    trzzzz
        10
    trzzzz  
       185 天前
    不想引入 mq ,就得找个地方存起来,存数据库,执行完更新下状态
    heqingpan
        11
    heqingpan  
       185 天前 via Android
    一定要找个地方存起来才行,不然重启在内存的数据就没了。

    可以用 mq 也可以用通用任务表(用完标记删除或物理删除都可以),特定场地存本地文件也可以。
    ExploreWorld
        12
    ExploreWorld  
       36 天前
    一个简单的处理办法,重启的时候指定所谓的优雅停止,也就是说不要 kill -9 ,kill -2 + sleep 10 秒,来让应用处理正在执行的任务同时停止外部新请求的进入,然后再加上单独的定时任务服务或者建个任务表定时扫描的形式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3620 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 11:01 · PVG 19:01 · LAX 04:01 · JFK 07:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.