知乎结构体系思考

null


作为一个开发者,重点写下知乎的产品目标和功能这一板块。功能板块主要分析知乎的数据库构件、用户的交互逻辑和后台架构。

1、产品目标

1.1需求

知乎的需求来自哪里,来自人与生俱来的好奇心、对知识的渴求欲、他人对自己的肯定等等,对应马斯洛需求理论就是安全的需要、尊重的需要和自我实现需要。  

安全的需要是人类群居的一个重要表现,对于知乎的定位来说,人对知识的掌握是稳定社会地位的一个重要手段,掌握了更多的知识才有更强的安全感。 

尊重需要得到满足,能使人对自己充满信心,对社会满腔热情,体验到自己活着的用处和价值。在知乎上答题,得到别人的感谢和赞同,无疑就是他人对自己的肯定,人最后的生活目标就是得到他人的肯定。 

自我实现的需要是在努力实现自己的潜力,使自己越来越成为自己所期望的人物。当一个人积累的多了,也就成为了行业的大牛,也就完成了自我实现。

1.2目标用户

本质的需求找到了,不难发现哪些人符合以上的要求: 

(1)社会地位较高 

(2)对某一个领域有着深刻的见解 

(3)希望实现自我价值 

(4)希望得到他人的认同 

这些人也就是知乎的种子用户,即大牛们;而想成为以上这样的人,或者说由大牛们的魅力而吸引的用户,就是传播用户(发展中的用户)。

1.3需求紧迫度

需求的重要性会随着人类的进步以及外部环境的改变而改变,今天人们的重点渴求不再是简单的物质需求,而大部分的人更多的是精神文化的需要,网络这一工具,更让人们具备了和自己领域中的高人们对话的机会。 

1.4用户的痛点

知乎的用户分为两类:一是为了实现自我价值的大牛,二是为了成为大牛的小白们。大牛的痛在于没有一个合适的平台去完成自我实现,在自我领域里没有追随者,无法将自己的思想传播开。  小白们的痛是没有一个平台去得到大牛们的指点,即使得到别人的帮助但是答案可能是低质量的,对于自己的提升没有一个准确的目标。

2、功能

2.1知乎数据库构建思考

知乎的数据库使用的是SQL数据库。至少有三个表,一个是用户信息表、一个是话题表、一个是值乎数据表。这里主要讲解话题表,知乎目前有几千万的用户,也有几千万的话题,很多话题直接都是有关联的,知乎主要采取的是多叉树。多叉树结合JavaScript树形控件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法)。下面简单举个多叉树的例子:

表:话题s

ID   名称

 1     a

 2     b

 3     c

 4     d

表:话题a-父s

ID   父ID

 2     1

 3     1

 4     2

 4     3

 

        a

       / \

      b  c

      \ /

        d

2.2后台架构

2.2.1初期架构选型

知乎的主力开发语言是Python。因为Python简单且强大,能够快速上手,开发效率高,而且社区活跃,团队成员也比较喜欢。

知乎使用的是Tornado框架。因为它支持异步,很适合做实时Comet应用,而且简单轻量,学习成本低,再就是有FriendFeed 的成熟案例,Facebook 的社区支持。

最初的想法是用云主机,节省成本。知乎的第一台服务器是512MB内存的Linode主机。但是网站上线后,内测受欢迎程度超出预期,很多用户反馈网站很慢。跨国网络延迟比想象的要大,特别是国内的网络不均衡,全国各地用户访问的情况都不太一样。这个问题,再加上当时要做域名备案,知乎又回到了自己买机器找机房的老路上。

2.2.2日志系统

日志系统的主要解决的问题是记录系统的运行轨迹,在这个基础上,进行跟踪分析错误,审计系统运行流程。在高可靠的系统中,是不允许系统运行终止的。日志系统的内容可以分为2类,一类可是业务级别的日志,主要供终端用户来分析他们业务过程;另一类是系统级别的日志,供开发者维护系统的稳定。

日志系统的设计,必须解决几个问题:

(1)使用方便,包括开发和信息检索。

(2)组织合理,日志内容被有效的组织起来。有助于基于日志内容的分析。

(3)过程重现,这个目标其实对开发者来说是最重要的。基于日志的分析,最重要的是重现当时运行的过程。

(4)可控制性,允许用户进行干预,特别是运行期的干预。比如关闭某些内容,或者重定向内容的输入目标点。

日志系统包括四个主要部分,日志来源、日志控制、日志输出和日志存储。

2.2.3事件驱动的架构

知乎这个产品有一个特点,最早在添加一个答案后,后续的操作其实只有更新通知、更新动态。但是随着整个功能的增加,又多出了一些更新索引、更新计数、内容审查等操作,后续操作五花八门。如果按照传统方式,维护逻辑会越来越庞大,维护性也会非常差。这种场景很适合事件驱动方式,所以开发团队对整个架构做了调整,做了事件驱动的架构。

知乎开发了一个叫Sink的小工具。它拿到消息后,先做本地的保存、持久化,然后再把消息分发出去。如果那台机器挂掉了,重启时可以完整恢复,确保消息不会丢失。然后它通过Miller开发框架,把消息放到任务队列。Sink更像是串行消息订阅服务,但任务需要并行化处理,Beanstalkd就派上了用场,由其对任务进行全周期管理。

举例而言,如果现在有用户回答了问题,首先系统会把问题写到MySQL里面,把消息塞到Sink,然后把问题返回给用户。Sink通过Miller把任务发给 Beanstalkd,Worker自己可以找到任务并处理。

2.3用户交互逻辑流程

2.3.1界面环境

使用黄金分割法分割屏幕,用水平分割线来分割屏幕,同时突出登录的重要性和展示部分内容去吸引用户。

null


null


视觉要符合所处的环境,其次才是品牌色。鲜艳的大块蓝色适合首页,内容页则以黑灰白为主色调以突显信息本身,但是完全素色的界面缺少活力。在控件反馈样式上使用蓝色,让蓝色使界面更显个性,同时不抢内容。

Web展示中,去掉了页头和页尾,吻合屏幕,没有滚动条,内容极度聚焦,清晰,耳目一新。

2.3.2网站结构

null



打开APP阅读更多精彩内容