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

feat: 引入更健壮的新视频检测方法 #228

Merged
merged 4 commits into from
Jan 22, 2025
Merged

Conversation

amtoaer
Copy link
Owner

@amtoaer amtoaer commented Jan 22, 2025

当前的新视频检测逻辑

  1. 从新到旧分页拉取视频(优先请求新视频)
  2. 按照拉取顺序分批写入到数据库中(避免对象囤积,节省内存)
  3. 当发现数据库中有“bvid、时间”重合的数据时认为到达了上次处理到的位置,中断任务(避免重复请求,减少请求次数)

缺点

当前的检测逻辑大多时候可以工作正常,但无法防御一些边缘情况,主要有两点。

1. 接口请求过程中发生视频新增操作

请求第一页并写入到数据库的过程中,用户又收藏、更新了一条视频,这样第一页的最后一个视频被挤到了第二页的第一个。
这样在处理第二页时,会发现数据库中有“bvid、时间”重合的数据,错误触发了中断逻辑,导致后续的未处理视频丢失。

2. 接口上页请求成功而下页请求失败

为了避免对象囤积节省内存,当前将视频写入数据库的顺序和接口的请求顺序是相同的,均为从新到旧。
如果有多页新视频,第一页请求成功且正确写入,第二页由于网络等原因请求错误,当前的处理逻辑是直接中断等待下次运行。
下次运行这个任务时,第一页这些较新的视频会触发中断逻辑,导致后续页面永久丢失,无法再处理。

解决方案

不难看出当前问题在于检测逻辑过于信任检测过程中产生的部分结果,导致对上次处理到的位置判断错误,要解决这个问题需要维护一个在整个检测过程完成才更新的值。

因此该 PR 为所有的 video list 表引入了 latest_row_at 字段,记录了最后处理的视频时间,该字段会在新视频检测运行全部完成时被更新为最大的视频时间。

中断的唯一判断条件是当前处理到的视频时间 <= latest_row_at

@amtoaer amtoaer marked this pull request as draft January 22, 2025 09:33
@amtoaer amtoaer changed the title WIP: feat: 引入更健壮的新视频检测方法 feat: 引入更健壮的新视频检测方法 Jan 22, 2025
@amtoaer amtoaer marked this pull request as ready for review January 22, 2025 15:47
@amtoaer amtoaer merged commit b4177d4 into main Jan 22, 2025
2 checks passed
@amtoaer amtoaer deleted the feat_latest_row_at branch January 25, 2025 05:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant