Large Feeds and RFC 5005
4 months ago
- #Performance Optimization
- #Feed Processing
- #SQLite
- Xobaque正被用于支持Search indieblog.page,导入了近5000个订阅源。
- 单一SQLite写入器成为瓶颈,因为'先查询foo是否存在,若存在则更新否则插入'的效率低下。
- 无法使用UPSERT操作,因为全文搜索通过虚拟表实现,该表不支持约束或索引。
- 部分博客的订阅源包含过多分页(例如12000、4000、2000页),这对更新订阅源而言似乎没有必要。
- 提及RFC 5005作为订阅源分页和归档的解决方案。
- 当前架构采用10个Go协程抓取订阅源,使用If-Modified-Since和If-None-Match请求头,并跳过304响应。
- 写入磁盘前需获取锁以确保同一时间只有一个SQLite写入器,导致速度缓慢。
- 通过将查询、插入和更新操作拆分为每1000项一批,运行时间缩短至约12小时。
- 后续改进方向包括:为预处理语句使用全局变量,根据Last-Modified请求头过滤订阅源以跳过未更改页面。
- 日志分析显示处理了1782个SQL更新的订阅源,另有2179个因HTTP缓存被跳过,其中多数页面未发生变化。