Pensieve: 2306

2023-06-25 21:30

所读

仍然是玩游戏中抽空读书, 这个月好歹读了三本. 第一本是一本漫画, Revenge of the Librarians, 基本算是文艺杂志副刊里四格漫画的合集, 不过挺可爱的, 很多地方卖梗, 要是书读得少一点, 翻这本漫画都找不到笑点. 第二本是小说逸语 : 钱锺书《围城》九段, 挺一般, 基本就是把自己和钱先生当时的沟通记录了一下而已, 不值得读. 最后一本是浪客美食家, 仍然挺一般的, 每个小故事铺排起来, 没个主线, 所以读起来比较平淡, 唯一印象比较深的是漏雨的U形吧台这篇.

原神

66天升到了55级, 应该算是比较快的了. 当然到了现在仍旧是55级, 毕竟经验曲线过了55后很陡峭. 成就数也很讨巧的是555.

蒙德探索度满了, 雪山探索度满了, 璃月72%, 稻妻没动还是95%. 渊下宫的键纹收集全了, 不过探索度还没满(87%). 草神瞳收集全了, 梦之树升了一半出头. 甘露池满了. 剧情来说, 沙漠和绿洲的主线都完成了. 人物来说, 新到手万叶, 加上之前的草行久和琴, 有了5个满级人物, 旅行者已经完成了80级突破, 不过懒得花经验书去拉了. 80级有莱依拉和香菱. 抽卡来说, 找了个抽卡分析的助手看了看: 常驻池第三次随到五星武器依次是41的风鹰剑, 16的天空之卷和80左右的狼末). 限定池里面之前小保底歪了琴是第75抽, 大保底这次又是75拿到万叶, 现在里面已经垫了近60, 手上还有130左右的彩球, 准备跳过3.8, 继续等着抽水神或雷神. 另外, 卡牌升到了9级, 目前两个牌组, 一个草雷反应擅长对群, 一个水火擅长对单. 后面还得慢慢摸索.

顺便评论几句游戏内容:

  1. 刷完神樱树, 梦之树和甘露池后觉得渊下宫的键纹真的很蠢. 本身找这些键纹的过程就已经很解密了, 要兑换这些键纹后还要一点一点在一个三维倾斜迷宫里去找对应地点, 体验真不怎么样.
  2. 四段主线剧情, 蒙德基本算是新手村, 璃月和稻妻的主线都不错, 须弥的主线是什么鬼.

Mongodb代理

最近工作中花了两周用go写了一个mongodb的代理服务器.

做mongodb代理的目的是要对所作的所有查询做审计, 而且要支持用SCRAM认证. 市面上有几个半成品(dvara, Mongoproxy, 不过都不算特别好用, 而且代码都比较旧. 唯一比较新的是teleport里面的实现, 不过仍然不能很方便地拆分出来.

上来写的时候一开始是参考了Mongoproxy, 不过很快代码就被我砍得只剩一点了, 后面主要参考了teleport的实现, 但是在这儿犯了一个错误. 因为我脑子里面想的是这种针对单用户的代理服务器, 维持一个客户端连接和一个服务器端连接就足够了. 所以在改teleport代码的时候, 在请求处理的地方砍掉了一些代码. 但是恰好mongodb的客户端就是会起多个连接访问数据库的.而好死不死, 服务器端那边大概是为了比较容易区分不同的客户端, 所以只会在客户端第一次请求时接受客户端的metadata. 按理说这么要求没毛病, 但是服务器端比较独断地对后续同一连接过来的客户端metadata直接返回一个报错. 这导致我理想状况中的单连接代理服务器不能正常工作. 我看到这个报错是不太理解, 加了很多日志读了很多文档查了很多源码也仍是如此. 我当时的想法是代理服务器里应该分析每个请求, 然后丢弃掉metadata, 不过折腾了好久也没能顺着这条路走下去(而且这样魔改太多也太不好看). 后面用官方已不再维护的mongoreplay工具分析请求才理解了这个设计. 然后回头改了代理服务器实现, 对每个客户端连接都新开一个到服务器的连接就好了.

顺便的, 当时用的是mongo-go-driver这个库. 因为是顺着teleport的实现用的, 发现这个库有一个高级API和底层API, 而底层API的文档基本没有, 只能靠读源码. 而使用这个库的时候, 库会默认帮你起两个额外的到服务器的连接, 一个用于监控网络质量, 一个用于服务发现和更新. 而我的代理服务器如果也这样的话, 新增加的连接数就会很夸张. 比如客户端连过来5个连接, 我起5个或7个到服务器的连接都还好说, 但是如果起15个就不太好看了. 钻了很久源码, 后面自己把核心的TCP连接部分拿出来自己写了一份后就好了. 客户端来5个连接, 我就建立五个到服务器的连接.

最后是单元测试, 犯懒不想自己写单元测试于是让ChatGPT帮我生成了一份. 好处是生成的像模像样, 缺点是写出的代码里有个BUG, 导致跑测试时会卡死. 仔细分析了很久才发现我自己实现的代码里需要对网络读两次, 而ChatGPT生成的mock里, 没有记录上次读取位置的指针. 提示ChatGPT去修这个问题, 修好后稍加润色就可以合并进代码库了.