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

异步记录日志,主体数据回滚了怎么办

  •  
  •   NoKey · 176 天前 · 2052 次点击
    这是一个创建于 176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟有个问题请教各位大佬:

    有个功能,用户在执行操作的时候,会记录日志(写表)

    为了让记录日志这步不影响主体数据的执行

    我们打算把日志异步记录

    那么问题来了,如果执行到一定位置,主体发生异常,回滚了

    怎么让异步写的日志跟着回滚呢。。。

    或者有没有用的比较广泛的符合这类需求的日志系统呢?

    谢谢

    28 条回复    2023-04-06 10:07:53 +08:00
    LeegoYih
        1
    LeegoYih  
       176 天前
    冲正,再写一条反日志
    optional
        2
    optional  
       176 天前 via iPhone
    transaction ?
    opengps
        3
    opengps  
       176 天前   ❤️ 2
    日志作为历史发生信息的记录,不应该跟着回滚吧,你说的日志是不是具体业务数据了?
    dqzcwxb
        4
    dqzcwxb  
       176 天前
    @LeegoYih #1 如果反日志也异常了咋办 手动狗头
    liuxu
        5
    liuxu  
       176 天前
    日志就是日志,回滚会打一条回滚的日志
    NoKey
        6
    NoKey  
    OP
       176 天前
    @LeegoYih 比如日志记录了一个用户的操作,执行任务,暂停任务,取消任务,那么日志会有三条,如果主体那边回滚了,日志这边咋记录?跟 sql 回滚一样,一条对一条?难度有点大哟🤣
    NoKey
        7
    NoKey  
    OP
       176 天前
    @opengps 可以不跟着回滚,那需要表达哪些日志是无效的(主体回滚了)
    jones2000
        8
    jones2000  
       176 天前
    建 id 关联, 关联不上的 id 就是废日志。
    abelyao
        9
    abelyao  
       176 天前
    不回滚,记录一条 XX 执行失败的日志(不是给用户看的那种日志)
    Oilybear
        10
    Oilybear  
       176 天前
    我也同意上面 opengps 老哥的说法,应该记录一条日志说上面若干无效。然后再有独立的 job 加锁冲正解锁,不然就不算日志系统了
    adoal
        11
    adoal  
       176 天前
    @NoKey “一条对一条?难度有点大哟” 同一事务的每条操作日志里都额外记录事务 id
    Nooooobycat
        12
    Nooooobycat  
       176 天前
    write ahead log? 写入的话就直接对文件末尾顺序写入,删除 /回滚也是写入,写入一个墓碑日志标记前一个日志失效
    leeqingshui
        13
    leeqingshui  
       176 天前
    异步写的日志为啥需要回滚?
    这个需求好奇怪呀,不想在日志表里看出错的日志?
    一般不是需要看日志中的标识字段查询请求的处理结果是否成功嘛?

    正常来说:代码出错了应该会报异常,对异常做回滚处理,而在日志表一般直接是用相关标识字段来标识(比如 Is_success_flag )请求是否处理成功,比如 Is_success_flag 为 1 ,那么请求是成功的,Is_success_flag 是 0 ,那么请求是失败的(失败也可以把出错信息记录到另一字段存储)。

    为啥需要回滚呢???
    xiri
        14
    xiri  
       176 天前 via Android
    主体异常这一情况不应该也记录到日志中吗?为什么反过来是日志要回滚。
    你如果要从日志追溯这一次主体的异常怎么办呢?
    huajia2005
        15
    huajia2005  
       176 天前
    日志不是给用户看的,主题回滚了,肯定有一条是错误日志,真要找也是有办法的.日志回滚没必要
    Wh1te
        16
    Wh1te  
       176 天前
    事务提交成功后再触发日志异步记录
    tedzhou1221
        17
    tedzhou1221  
       176 天前
    不是业务逻辑通过后才异步记录日志吗?有点好奇啊
    cryboy007
        18
    cryboy007  
       176 天前
    不应该通过事务提交事件去做嘛
    zhaogaz
        19
    zhaogaz  
       176 天前
    我猜一下, 我觉得可能是没定义清楚业务概念。

    你说的这个记录日志,应该是一种业务数据, 不是正常意义上的一种程序输出的日志。所以你这个记录日志应该是某一个业务需求的一部分。

    感觉上你这个可能是某些审计需求。

    如果是我的话,根据你的描述,可能会套一个事务里面,完成之后,再发异步消息。大概这个思路。
    securityCoding
        20
    securityCoding  
       176 天前
    日志为啥要回滚,记录异常日志不就好了吗
    ychost
        21
    ychost  
       176 天前
    回滚了再写一条就行了呗,
    DinnyXu
        22
    DinnyXu  
       176 天前
    感觉很多人没明白 op 说的意思,op 的意思其实就是一个典型的异步事务管控,主体就好比是 A 表,日志就好比是 B 表,而 A 表不在异步事务内,B 表在异步事务内,倘若 A 表出现异常了,这个时候的事务只能回滚 A ,无法回滚 B 。

    而 op 需要的就是 A 回滚的时候,也把 B 回滚,以下说几种方法:

    1:手动事务提交,主体完成后修改事务为待提交,B 完成后,整体提交事务,这种情况需要注意的是主体的执行时间和日志记录的执行时间不能相差太多,好比主体执行 1s ,日志执行 5s...

    2:主体与日志进行某种程度的关联,主体失败后马上记录一条失败的消息到本地表,日志业务执行完成后,检测一下本地表的主体任务是否是完成状态,根据状态进行修正

    3:异步消息回滚,类似于 MQ 之类的,这个说起来就比较复杂了,建议还是上面 2 种比较切合实际
    ihuotui
        23
    ihuotui  
       176 天前
    参考数据库的实现
    546L5LiK6ZOt
        24
    546L5LiK6ZOt  
       176 天前
    两个线程同时操作数据库,又要保证一致性,这相当于是分布式事务了。不过分布式事务的框架比较重,直接搞个定时任务来检查日志是否需要回滚更简单点,做到最终一致。

    异步操作是为了不影响主流程,保证可用性,但是可用性和一致性不可兼得。。
    Red998
        25
    Red998  
       175 天前
    主体成功才异步操作、不成功就不操作
    Dganzh
        26
    Dganzh  
       175 天前
    怎么确保这个异步日志写成功的?
    NoKey
        27
    NoKey  
    OP
       175 天前
    @zhaogaz 嗯嗯,对的,我没说清楚,操作日志,也算业务数据,用户要查看的,或者出现疑问了,要根据这个操作日志来判断到底是用户自己操作的,还是服务有问题
    NoKey
        28
    NoKey  
    OP
       175 天前
    @DinnyXu 感谢,是这个意思
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3232 人在线   最高记录 6067   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:23 · PVG 12:23 · LAX 21:23 · JFK 00:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.