知乎在线部分的技术架构

知乎在线部分的技术架构

作者:姚钢强
链接:https://www.zhihu.com/question/314356555/answer/625772570
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

知乎截至 2019 年 1 月的数据:

  • 用户数:2.2 亿
  • 话题数: 27 万
  • 问题数: 3000 万
  • 回答数: 1.3 亿

以下内容全部基于 2019.1 之前情况

简述下知乎在线部分的技术架构,先看下整体的架构图,整体比较清晰不再赘述。

知乎在线架构

  1. 微服务架构,知乎从 11 年就开始了微服务的探索,尝试过 protocol buffersAvroThrift,最终在 16 年确认使用 Thrift,同时使用 Consul 和 HAProxy 作为注册中心和负载均衡。是在 14 年确认的这套微服务架构,并且稳定使用到了现在。所以大家不要问为什么不使用 gRPC 了。
  2. 云平台,知乎有自己的内部研发的 ZAE ,绝大部分的在线业务容器在 15 年就已经全部跑在了 Docker 里,现在我们 HBase 和 Kafka 也是跑在容器里的。我们最开始使用的是Mesos 做的资源调度,现在已经切换到了 Kubernetes 。
  3. 部署平台,知乎的部署平台是与 ZAE 在一起的, 基于 Jenkins 搭建的自动集成,在 MR(Gitlab) 阶段自动使用 SonarQube 进行静态代码检查。部署分为测试环境,办公室环境,金丝雀1(灰度单个容器),金丝雀2(灰度 20% 流量),生产环境(100% 流量上线)。如果金丝雀阶段出现错误,会自动进行回滚操作。
  4. 监控,我们主要基于 GrafanaOpenTracingGraphite 等搭建了监控系统。同时自研了 Halo 可以方便的是业务方观测到服务之间的依赖关系、响应时间(P95, P99, P999)、错误数。同时也进行了新技术的尝试,目前在业务容器监控使用了Prometheus 。
  5. 存储,主要是 MySQLRedisHBase;正在调研 TiDB,目前有一套生产集群上线准备给「已读」服务使用。
  6. 消息队列,早期使用自研的 Sink,目前使用 Kafka,同时提供在 Kafka 的基础上包装了Beanstalkd 作为任务队列方便业务进行使用。
  7. 编程语言,PythonGolangJavaRust。目前 Golang 使用比较广泛,Python 使用场景逐渐变少。Java 在一些算法项目和商业系统中有使用。搜索系统使用的 Rust 重写 Lucene,现并在此基础上重写了类 ES 的集群化搜索引擎。架构师 会去 做分享。
  8. 目前已经搭建好完备的测试环境,会在 Q2 投入使用。
  9. 现在已经搭建了多机房,目前重要的业务都是异地多活。

总结:

  1. 勇于探索新的技术,例如早期的微服务(11 年)和容器化(15年)。
  2. 在开源技术可以满足的前提下,尽量不自造轮子,从而使项目可以持续维护。
  3. 知乎技术上一直崇尚工具化、自动化,例如我们的部署平台,监控,报警系统等,不管是平台还是业务方,都没有专职的运维人员。
  4. 整体来说知乎的平台化(我不是做平台的)一直做得很统一,比较少出现业务方自造一套轮子的情况,但是也不排斥业务方的尝试。

感谢知乎优秀的技术平台工程师,给我们业务方带来这么好的基础设施。:-D

==================== End

原文地址:https://www.cnblogs.com/lsgxeva/p/10578281.html