We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
最近看APM上面的API响应,发现有个API在挑事,平均响应时长4s,已经到了不可忍受的地步。
仔细一看,发现是动态有关的API,类似于微博,进一步分析发现,这个API设计不合理:用了mongo的aggregate,占了响应时长的90%以上,这个不适合在API使用,因为非常耗数据库的计算性能。
User: { _id: ObjectId, followings: Number, followers: Number, } TweetPage: { user: ObjectId, count: Number, oldest: Date, newest: Date, tweets: [{ _id: ObjectId, title: String, content: String, }] } Follower: { user: ObjectId, followers: [ObjectId] } Following: { user: ObjectId, followers: [ObjectId] } ReTweet: { //转发的Tweet _id: ObjectId, title: String, content: String, }
每个用户有一个TweetPage,于是每次请求TimeLine,都会把所有当前用户follow的用户的TweetPage取出来,做一个TweetPage.aggregate,由此,这个API才会那么耗时间。
于是,重构方向就是针对这种场景下的数据高读写比,重新设计数据结构。同时,还需要顾及以后的产品改进方向,而且重构不可改变API的行为,所以不添加任何新行为。
git commit
ReTweet
TweetPage
Tweet
TimeLine
此次重构,其中包含了一个计算机科学中非常朴素的简单原理:用空间换时间,因为用户『写』微博的时候比『读』微博的次数少,因此可以用增加写的时间与空间,来换取读的时间减少,也不需要更多的计算。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
最近看APM上面的API响应,发现有个API在挑事,平均响应时长4s,已经到了不可忍受的地步。
仔细一看,发现是动态有关的API,类似于微博,进一步分析发现,这个API设计不合理:用了mongo的aggregate,占了响应时长的90%以上,这个不适合在API使用,因为非常耗数据库的计算性能。
Mongo数据库结构
每个用户有一个TweetPage,于是每次请求TimeLine,都会把所有当前用户follow的用户的TweetPage取出来,做一个TweetPage.aggregate,由此,这个API才会那么耗时间。
主要原因
于是,重构方向就是针对这种场景下的数据高读写比,重新设计数据结构。同时,还需要顾及以后的产品改进方向,而且重构不可改变API的行为,所以不添加任何新行为。
具体步骤
git commit
;ReTweet
是个妥协的存在,因为TweetPage
设计失败了,ReTweet
是为了转发的API而添加的内容。因此,Tweet
有必要拿出来,单独作为一个collection,TweetPage
也可以去掉了。同时,为了提高获取TimeLine
接口的性能,单独添加TimeLine
collection,每一个用户一个document,每当用户添加或者删除Tweet
,或者follow关系改变的时候,主动更新follow的用户TimeLine
,获取TimeLine
的时候,直接获取当前用户的TimeLine
即可,然后取出对应的Tweet
。进一步,可将一些热门Tweet
放在缓存中。由此,解决了微博的高读写比问题;说在最后
此次重构,其中包含了一个计算机科学中非常朴素的简单原理:用空间换时间,因为用户『写』微博的时候比『读』微博的次数少,因此可以用增加写的时间与空间,来换取读的时间减少,也不需要更多的计算。
The text was updated successfully, but these errors were encountered: