小弟有个问题请教各位大佬:
有个功能,用户在执行操作的时候,会记录日志(写表)
为了让记录日志这步不影响主体数据的执行
我们打算把日志异步记录
那么问题来了,如果执行到一定位置,主体发生异常,回滚了
怎么让异步写的日志跟着回滚呢。。。
或者有没有用的比较广泛的符合这类需求的日志系统呢?
谢谢
1
LeegoYih 2023-04-04 15:25:26 +08:00
冲正,再写一条反日志
|
2
optional 2023-04-04 15:29:15 +08:00 via iPhone
transaction ?
|
3
opengps 2023-04-04 15:29:35 +08:00 3
日志作为历史发生信息的记录,不应该跟着回滚吧,你说的日志是不是具体业务数据了?
|
5
liuxu 2023-04-04 15:43:09 +08:00
日志就是日志,回滚会打一条回滚的日志
|
6
NoKey OP @LeegoYih 比如日志记录了一个用户的操作,执行任务,暂停任务,取消任务,那么日志会有三条,如果主体那边回滚了,日志这边咋记录?跟 sql 回滚一样,一条对一条?难度有点大哟🤣
|
8
jones2000 2023-04-04 15:56:43 +08:00
建 id 关联, 关联不上的 id 就是废日志。
|
9
abelyao 2023-04-04 16:00:24 +08:00
不回滚,记录一条 XX 执行失败的日志(不是给用户看的那种日志)
|
10
Oilybear 2023-04-04 16:32:19 +08:00
我也同意上面 opengps 老哥的说法,应该记录一条日志说上面若干无效。然后再有独立的 job 加锁冲正解锁,不然就不算日志系统了
|
12
Nooooobycat 2023-04-04 16:43:47 +08:00
write ahead log? 写入的话就直接对文件末尾顺序写入,删除 /回滚也是写入,写入一个墓碑日志标记前一个日志失效
|
13
leeqingshui 2023-04-04 16:59:01 +08:00
异步写的日志为啥需要回滚?
这个需求好奇怪呀,不想在日志表里看出错的日志? 一般不是需要看日志中的标识字段查询请求的处理结果是否成功嘛? 正常来说:代码出错了应该会报异常,对异常做回滚处理,而在日志表一般直接是用相关标识字段来标识(比如 Is_success_flag )请求是否处理成功,比如 Is_success_flag 为 1 ,那么请求是成功的,Is_success_flag 是 0 ,那么请求是失败的(失败也可以把出错信息记录到另一字段存储)。 为啥需要回滚呢??? |
14
xiri 2023-04-04 17:02:22 +08:00 via Android
主体异常这一情况不应该也记录到日志中吗?为什么反过来是日志要回滚。
你如果要从日志追溯这一次主体的异常怎么办呢? |
15
huajia2005 2023-04-04 17:03:50 +08:00
日志不是给用户看的,主题回滚了,肯定有一条是错误日志,真要找也是有办法的.日志回滚没必要
|
16
Wh1te 2023-04-04 17:14:28 +08:00
事务提交成功后再触发日志异步记录
|
17
tedzhou1221 2023-04-04 17:19:58 +08:00
不是业务逻辑通过后才异步记录日志吗?有点好奇啊
|
18
cryboy007 2023-04-04 17:31:09 +08:00
不应该通过事务提交事件去做嘛
|
19
zhaogaz 2023-04-04 20:39:56 +08:00
我猜一下, 我觉得可能是没定义清楚业务概念。
你说的这个记录日志,应该是一种业务数据, 不是正常意义上的一种程序输出的日志。所以你这个记录日志应该是某一个业务需求的一部分。 感觉上你这个可能是某些审计需求。 如果是我的话,根据你的描述,可能会套一个事务里面,完成之后,再发异步消息。大概这个思路。 |
20
securityCoding 2023-04-04 20:47:47 +08:00
日志为啥要回滚,记录异常日志不就好了吗
|
21
ychost 2023-04-04 21:09:20 +08:00
回滚了再写一条就行了呗,
|
22
DinnyXu 2023-04-04 21:23:09 +08:00
感觉很多人没明白 op 说的意思,op 的意思其实就是一个典型的异步事务管控,主体就好比是 A 表,日志就好比是 B 表,而 A 表不在异步事务内,B 表在异步事务内,倘若 A 表出现异常了,这个时候的事务只能回滚 A ,无法回滚 B 。
而 op 需要的就是 A 回滚的时候,也把 B 回滚,以下说几种方法: 1:手动事务提交,主体完成后修改事务为待提交,B 完成后,整体提交事务,这种情况需要注意的是主体的执行时间和日志记录的执行时间不能相差太多,好比主体执行 1s ,日志执行 5s... 2:主体与日志进行某种程度的关联,主体失败后马上记录一条失败的消息到本地表,日志业务执行完成后,检测一下本地表的主体任务是否是完成状态,根据状态进行修正 3:异步消息回滚,类似于 MQ 之类的,这个说起来就比较复杂了,建议还是上面 2 种比较切合实际 |
23
ihuotui 2023-04-04 21:26:47 +08:00
参考数据库的实现
|
24
546L5LiK6ZOt 2023-04-05 10:25:32 +08:00
两个线程同时操作数据库,又要保证一致性,这相当于是分布式事务了。不过分布式事务的框架比较重,直接搞个定时任务来检查日志是否需要回滚更简单点,做到最终一致。
异步操作是为了不影响主流程,保证可用性,但是可用性和一致性不可兼得。。 |
25
Red998 2023-04-05 13:23:01 +08:00
主体成功才异步操作、不成功就不操作
|
26
Dganzh 2023-04-05 15:52:26 +08:00
怎么确保这个异步日志写成功的?
|