Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

optimize : tccfence log table deleted should be optimized #745

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

Similarityoung
Copy link

What this PR does:

Delete the logs generated by fence and use limit to restrict the number of deletions each time.

Which issue(s) this PR fixes:

Fixes #699

Special notes for your reviewer: null

Does this PR introduce a user-facing change?: no

@Similarityoung
Copy link
Author

佬们,能教教孩子吗

我注意到 java 那里实现方式是先找一千个需要删除的日志,记录 xid 再进行删除,如此循环直到找不出日志为止。

然后我注意到再 go 里面 fence 里有个channel : traversalCleanChannel是用来放需要删除日志的 xid和 brandId 的。我有考虑过直接通过定时任务查询需要删除的日志,把他们的 xid 和 brandId 放进这个 channel 中。但是我感觉这样通过 channel 一次删除一条日志的效率太低了。

所以我就重新写了一个定时任务,在每天零点的时候执行,也没有查找日志再删除,而是直接进行日志删除,并采用循环直到没有日志需要删除。

最后我的问题是:

  1. 我这样设计是否合理,我有考虑另一种方式实现:先查询日志,再一个个插入进 channel 中,然后 channel 一次性删除多条日志。

  2. 目前我写完了那个定时任务,但是我不知道,在 fence初始化的哪里对这个定时任务进行调用

  3. 目前我只对删除 sql 进行了测试,对于定时任务的测试我不是很清楚该如何测试

@luky116
Copy link
Contributor

luky116 commented Dec 21, 2024

佬们,能教教孩子吗

我注意到 java 那里实现方式是先找一千个需要删除的日志,记录 xid 再进行删除,如此循环直到找不出日志为止。

然后我注意到再 go 里面 fence 里有个channel : traversalCleanChannel是用来放需要删除日志的 xid和 brandId 的。我有考虑过直接通过定时任务查询需要删除的日志,把他们的 xid 和 brandId 放进这个 channel 中。但是我感觉这样通过 channel 一次删除一条日志的效率太低了。

所以我就重新写了一个定时任务,在每天零点的时候执行,也没有查找日志再删除,而是直接进行日志删除,并采用循环直到没有日志需要删除。

最后我的问题是:

  1. 我这样设计是否合理,我有考虑另一种方式实现:先查询日志,再一个个插入进 channel 中,然后 channel 一次性删除多条日志。
  2. 目前我写完了那个定时任务,但是我不知道,在 fence初始化的哪里对这个定时任务进行调用
  3. 目前我只对删除 sql 进行了测试,对于定时任务的测试我不是很清楚该如何测试

1、短期内,每晚执行删除,每次删除1000条,分多次删除,是可以的;
2、如果使用 traversalCleanChannel ,监听者可以对收到的 traversalCleanChannel 的消息进行计数,如果收到 n 条再执行一次删除,也是可行的
image
3、第2中方式能保证清理fence 日志的压力分散均匀,可能会更好点

如果后面有其他问题,可以继续优化,短期内先实现一种

for {
deletedRowCount, err := handler.tccFenceDao.DeleteTCCFenceDOByMdfDate(tx, timeBefore, limitDelete)
if err != nil {
fmt.Printf("Error occurred during TCC fence clean task: %v\n", err)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

日志统一使用 log 来输出

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这种方式还有个问题,如果网络抖动一次,当前的删除工作就终止的

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

如果采用评论区说的,使用channel,见听到一定条数删除一次,看看会有啥啥问题不

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[seata-java] optimize : tccfence log table deleted should be optimized
2 participants