开发日志
第一次决定开始写开发日志,之前捣鼓后端的时候还没有写这个日志得想法,现在想想总觉得有必要,可以复盘,告诉自己学了什么,还有什么不会,还是非常有用的
2026.01.23
昨天看了一下接口延迟,不知道是什么原因,服务器在上海,平均下来每个接口延迟超过了100ms,去看了一下调用流程,发现每次请求接口前都会发送一个预检请求,查了一下才知道是跨域的时候才会出现,可能是我没加预检缓存导致接口返回缓慢
昨天还发现一个问题,慢查询现象比较严重,不知道gorm算的时间有没有包括建立连接这段时间,毕竟放数据库的服务器在新加坡,后续得排查一下慢查询,还有就是得给日志表分区,然后优化一下索引
今天花了半个小时重构了一下github的graphql查询结构体的定义,现在看起来会比较清爽
接着准备搞一下websocket,可以实时监控数据,相较于http便捷很多,思索了一下,觉得这个还是有必要搞的,至少可以接触一下协程,之前搞协程只是为了操作redis,还没有在通道里真正传输过数据,以下几点比较麻烦
- websocket不允许自定义请求头,意味着我之前写的中间件都没用了,可能要把token放到请求参数中
- websocket的模型我没搞懂,业务逻辑自然也无法理顺
- 要对哪些接口做ws,哪些接口走传统http
ws模型
- conn:前端发起的连接,用http访问,后端把http升级成ws,包装成client,然后注册到hub
- 升级使用websocket包自带的upgrader
- client:客户端对象,每个client都分别有一个channel专门写、收信息,启动俩循环,一个写,发送信息、ping前端,一个读,用于获取pong,验证前端还在线
- hub:管理中心
- 客户端map
- 注册通道,开辟这个通道是为了防止多个协程同时操作map导致panic,使用通道还可以不用为map加锁
- 注销通道,同上
- 广播通道,若客户端通道已经慢了,说明其阻塞严重,直接断开连接
2026.01.24
今天成功跑通前端代码,也成功部署,但出现以下棘手问题
博客部署在cf上,后端无法解析客户端真实ip
数据库缺乏国家英文字段,世界地图无法被正常渲染
博客打开一个页面就连续发好几次请求,而且大部分延迟都是1ms
打算更改Nginx,传递CF请求头,在请求头中拿真实ip,同时信任CF的所有网段,从这些ip请求里面拿真实ip传递到X-Forwarded-For中,做双重保险,后续测试了一下没问题
同时我给表增添了几个字段存储国家地区城市的英文名和代码,Geo解析IP的时候直接放进去即可
最后一个问题我没有什么头绪,也没系统学过前端,后续再看看
2026.01.29
这几天啥也没干,猛猛学标准库,发现自己还有很多不会,闲暇之余更新了下仓库的README.md
感觉标准库那块面试问的还是比较多,也是看的我发昏,源码也是难以看懂,都是让AI给我慢慢解释,不过也让我体会到开发并非易事,这个领域有太多优秀的天才
2026.02.03
这几天一直在干美赛,凌晨三点多把论文交完就开始着手搞死链检测,弄下来感觉目前最大的问题不是代码能力,而是业务的流程和具体的思路,感觉我还缺失对这些东西建模的能力。
今天就到这吧,要赶高铁回家了。记于2026/2/3 6:12
2026.02.04
把死链检测的大致流程肝完了,还有一些小瑕疵比如过滤特定URL还没完成,后续再逐渐完善
遇到的几个问题(已解决)
- 用多协程做并发扫描时对同一个map进行操作要加锁
- 写完代码要复查,否则多协程可能造成死锁或者阻塞
- 要多考虑维护和后续升级的成本,代码应该规范
老问题
- 前端发统计请求的时候老是会重复发送,我都不知道咋回事,我认为可以加个双重保险
- 前后端分别加限制,后端对一段时间内的相同请求不予处理,前端我没仔细学过,得好好思索下
GPT给了死链检测的一个好思路
- 先发
HEAD,再发GET HEAD请求不返回响应体,可以有效减小资源消耗,当某个网址确确实实打不开时,可以不用GET,用HEAD就可以判断出来
2026.02.05
今天把发送邮件的大体逻辑写完了,企业邮箱也配置好了,现在就是要解决HTML模板填充的问题。发邮件使用的是goemail这个第三方包,一键配置SMTP、端口、服务器,还是很方便的;填充HTML模板用的是html/template这个包,它可以按照我提供的结构体字段名去替换掉HTML模板里面的占位符,现在的主要问题是
- 目前已有的HTML模板和当前能拿到的数据名称不匹配,需要进行处理
- 订阅服务以及评论通知和评论统计还需要进行配置和代码的开发
2026.02.12
这几天把死链检测和邮箱大体逻辑搞定,也都调通了,前后端也都加了限流防止短时间接口多次上报,也加了三个数据表统计死链检测和订阅用户的数据,后面要给订阅加一个验证码功能,防止别人滥用邮箱打垮我的服务器。
现在主要问题:
订阅功能无验证码
管理后台还有bug,地图分布要过滤空值
邮件模板修改下copyright
管理后台展示新增的三个表
死链检测有bug
2026.02.13
今天把昨天的问题解决的差不多了,主要是在原有基础上做优化
- 加了个订阅成功后删除验证码的逻辑
- 操作redis传入超时上下文
后续会在管理端展示新增的三个表
死链检测思考了一下发现不能直接扫html,应该扫md,扫html会把奇怪的通用组件的外链统计进来,但这不是我想要的,我只需要扫文章的外链,明天再改吧!
2026.02.14
今天把死链检测的逻辑改了一下,改成先克隆远程仓库,再去扫md文件,直接扫html会扫到我不需要的链接,同时今天准备着手搞一下优雅关闭,比之前直接关闭好一点
2026.02.15
今天决定改一下死链检测的逻辑,之前是直接clone仓库,这样会导致我梯子的流量被消耗得很严重,并且clone仓库的速度也很慢,和gpt交流了下,发现可以使用缓存+fetch更新文件的逻辑来进行死链检测
流程:先建立中央仓库(裸仓库),进行镜像克隆,存在磁盘中;使用fetch获取最新变更,只下载增量数据;搭建样板间(worktree),本质上是中央仓库的只读快照,进行死链检测;检测完毕对worktree进行销毁
几个知识点
裸仓库:无工作区,存储
Git历史和元数据的仓库git clone -mirror或者git clone --bare- 省空间,体积小
- 后续使用
fetch解码出所需要的md文件
Git Wokrtree:基于同一个本地git仓库,检出多个不同的分支放在不同文件夹- 使用完毕后进行销毁,不污染裸仓库
2026.02.22
今天主要是修Bug,后端返回的信息是这样
"devices": [
{
"device": "desktop",
"percent": 68
},
{
"device": "desktop",
"percent": 29
},
{
"device": "mobile",
"percent": 2
}
]非常奇怪,看了代码之后才发现是数据库实例混用导致不同的查询被污染
先后执行以下两段代码,会导致第二次查询的group携带了第一次查询的country
err := db.Select("country,count(*) as count").
Group("country").
Order("count desc").
Limit(3).
Scan(&countries).Error
err = db.Select("device, count(*) as count").
Group("device").
Order("count desc").
Limit(3).
Scan(&devices).Error解决办法:使用.Session(&gorm.Session{})开启一个干净的克隆对话
2026.02.23
解决了管理页面的bug,引入ip2region来解析国内ip的真实地址,让ip解析的准确率大幅提升,国外IP依旧使用GeoLite
后续可能考虑引入消息队列解决github webhook重试、失败的问题
2026.03.04
修复评论区周报结构体定义的Bug,纯粹是忘记了Github的GraphQL咋写了,看了日志才发现这个Bug已经跑了两个星期
