A Faster and Better zhihu-card-server

zhihu-card 又有几个新用户了!

Polo's Blog

xlzd杂谈

小狐濡尾

Tian Jun

其实有些并不是新用户,只不过我上次没发现。Redis 里还有几条别的用户记录,但并未找到个人网站。

这篇文章主要讲什么呢?国庆及最近几天大改了后端架构,并且开源出来,所以就来说一说。这篇文章在我看来价值并不大,因为并没有包含多少探索的过程,不过姑且做个记录。

目前的架构长这个样。

jsDelivr 和 Chrome 的部分都在 zhihu-card 项目里,不是本文重点,总之后端会接收前端发的请求,并返回用户数据。

后端主要就三块,一个 Golang 的 HTTP Server,一个 Redis,一个 Nameko 的 local server。Go server 和 Redis 的交互就是很普通的 GET/SET,Redis 在 key 过期的时候会给 Go server 发通知让它去更新数据。不论是获取新用户数据还是更新已存在用户的数据,Go server 都是通过向跑在本地 Nameko server 发送一个请求,由 Nameko server 返回最新的用户数据。

OK,那么 Nameko 是什么?我最早是从大名鼎鼎的 Flask 作者 Armin Ronacher 的博文知道的,当然他并不是主要贡献者。Nameko 是一个用 Python 写的微服务框架,接口设计非常简洁,基本看一分钟文档就能上手。在做毕设的过程中我一度想尝试,不过后来发现需求不同转而使用了 huey(顺带一提 huey 也是个好东西,一个超轻量级的 task queue,该有的都有用起来也很稳定)。

所以为什么要用 Nameko?主要是因为我想用 zhihu-oauth,这样就可以省去因为知乎前端变动带来的代码修改工作。zhihu-oauth 是 Python 写的,那么 Nameko 就非常合适了。本来也不是说一定要用 zhihu-oauth,如果有 Go 的 zhihu oauth 客户端更好,这样连 Nameko 都不需要,但是没有啊。另外我对维护者 7sdream 同学的代码水平和修 bug 速度还是很有信心的,感谢他的出色工作。

在这次大改之前,后端会在请求到来时检查 Redis 中有无对应数据,如果没有,就把知乎的个人主页抓下来,提取数据存入 Redis 并返回给用户。这么做有两个问题,其一是知乎前端一变我就得改代码,其二是速度——每个 hit 到 cache miss 的访问者将不得不额外忍受一个访问知乎个人主页的 RTT。虽然不是大问题,但总觉得不爽。现在和知乎的交互全交给 zhihu-oauth 去做,速度比 GET 网页快很多。另一方面,由于 Redis 在 key 过期时会通知 Go server 并获取最新数据,因此对于已存在的用户,Redis 中总是有数据的,进一步减少了访问耗时。这个结论只在数据很少的时候成立,根据 Redis 文档,key expire 是每秒检查 10 次,每次 20 个:

Specifically this is what Redis does 10 times per second:

  1. Test 20 random keys from the set of keys with an associated expire.
  2. Delete all the keys found expired.
  3. If more than 25% of keys were expired, start again from step 1.

现在的数据量完全可以保证在 1s 内检查完所有 key。

zhihu-card-server 目前还不完善。上面我说 Nameko 很好,其实这个库用起来特别坑,有些很重要的事文档里是不写的。目前又遇到程序莫名其妙退出的 bug,还没有解决,只好先加上一个 fallback,在无法从 Nameko 获取数据的时候直接访问网页。还有 Go server 的异常处理,logging 这些也还没写……总之慢慢搞吧。

最后推荐一下我正在用的 markdown 编辑器 typora,前段时间正好在想类似功能,发现已经有人做出来了。简单来说,你不再需要左边 markdown 右边渲染了,渲染和文本现在放在一起,就好像在写 Word 一样。

zhihu-card 竟然有两个用户!

今天田俊给 zhihu-card 提了个 issue,于是在刷 Redis 的时候顺便看了下之前的数据,发现居然有五条!

127.0.0.1:6379> KEYS *
1) "6487fb46d752cc83f9a5eebf2134ed1c"
2) "1f644a1b7da169d2b56e1a4c6da61fea"
3) "5a6237cebe73cf47a10f1ba0c604cb8c"
4) "ac5860a0000ac307eda1c957a4a23643"
5) "9dc46aa6570ad50f998d93e5e63049de"

不过其实有三条分别是我、程浩和田俊,算不上真正的用户。那么其它两条呢?

一位是:https://www.zhihu.com/people/zhihudianxiaoer。我点进它的主页,果然有个人网站,网站上的确在使用 zhihu-card。

然而尺寸似乎大了点,会不会是用户不知道可以调宽度呢?于是我就试着在网页里改了一下:

这下尴尬了,发现是因为代码有 bug 所以用户才不调整的……明天修一下好了。

另一位是 https://www.zhihu.com/people/xlzd,不过没看到他的网站。

First Day

其实没什么特别的,但既然是第一天,还是记录一下吧。

大致做的事有:拍照、领电脑、介绍情况、参观办公室、见同事。今天算是窥见了庞大内部系统的冰山一角,要熟悉很多网址,走各种流程,这还没算上今后要掌握的开发工具。流程规范、事无巨细,或许这就是超大型公司的特点吧。一天下来,虽然一行代码都没写,却也十分疲劳,前辈给的项目文档,也没时间去看。

组里的同事看起来既聪明又 nice,希望以后能有愉快的合作。也和 boss 聊了一下,他给了我一些建议。

晚上下班,我坐电梯从大楼上下来。楼外有若干旅行团正集结往入口移动。从他们身边走过时,我想起几年前也曾作为游客登上观光厅,不敢透过玻璃地板往下看。当时我没有意识到有人在楼里工作,更没料到自己居然有一天会在这工作。

放一张照片吧,在 52 层拍的:

生活类的文章里似乎都是好事,但那只不过是因为我一般不写坏事。很多人在博客里记录生活的烦恼,我读着也苦闷起来。所以我就不写。然而这些事总归是存在的,比如快递寄到房子时我在上班,比如公司的午睡铺数量很少,诸如此类。


top