公司:知乎
知乎是一家中国大陆的问答网站,创立于2011年1月26日,产品形态与美国在线问答网站Quora类似。“知乎”在文言文中意为“知道吗”。2012年2月底,知乎使用“发现更大的世界”作为其宣传口号。截至2017年9月20日,知乎注册用户数超1亿,日活跃用户量达2600万,人均日访问时长1小时,月浏览量180亿。截至2016年5月,知乎累计产生了1000万个提问、3400万个回答和3500万个赞同。2021年至纽交所上市,在挖掘优质创作会员与投入自有内容的同时,随着多样性的社群文化增加,知乎越来越类似于reddit等同好论坛。
知乎由北京智者天下科技有限公司(法律性质为有限责任公司)所持有,其法律代表人是李大海。智者天下亦开发了包括Android、iOS平台的手机“知乎客户端”、“知乎群组”、“知乎日报”与“公益壹点通”四款手机应用程序。
轻量级 Mock 接口及文档管理平台 - Ming
「Ming」是知乎内部的一个Mock接口和文档管理平台。它解决了过去接口文档和Mock接口管理混乱的问题,并提供了轻量级的解决方案。在接口定义方面,不同的接口管理平台使用不同的方案,其中一种常见的方案是使用JSON Schema。JSON Schema详细描述了每个字段的类型和可选值,但过于冗长且不适合人阅读。虽然对于简单的结构还可以理解,但对于稍微复杂的结构很难在短时间内理解。
Timon 覆盖率工具在知乎测试实践中的应用
文章介绍了一种测试覆盖率工具Timon,它可以实时收集代码覆盖率并生成报告。Timon支持Java、Python和Golang三种语言,可以在接口测试和集成测试等场景使用。文章还介绍了Timon的原理和模块设计,其中包括编译阶段的插桩和部署阶段的客户端和服务端模块。工具的主要功能包括增量代码覆盖率计算、生成配置文件、历史数据管理和报告展示界面。
知乎这样的内容社区,如何做好 AI 架构搭建与应用?
知乎是一个内容社区,近期参加了2020世界人工智能大会云端峰会。知乎的AI团队通过引入机器学习技术,将AI应用到社区的各个环节。为了加速AI应用的发展,团队构建了统一的基础服务架构,统一定义算法的工作流和数据流,提高服务质量和稳定性。通过这一架构,团队能够构建通用代码库,提高代码复用率,解决项目和代码散乱的问题。团队成员的开发工作模式一致,沟通效率得到提升。团队不再需要关注通用细节,将主要精力用于解决核心算法和模型,加速技术积累和业务创新。
聊聊知乎订单系统迁移
知乎订单系统后端语言栈正在进行转型升级,从Python转向Go和Java。转型的目标是提高系统稳定性和性能,适应复杂的交易场景。转型将降低项目复杂性,提高可维护性和可迭代性。迁移过程需要进行准备工作,按照新语言的实现风格进行迁移。重构和优化可以在迁移完成后进行。转型的成本包括人力成本和并行开发成本,风险包括引入新的bug和增加测试复杂性。根据成本与收益的权衡,最优方案是采用只迁移的方式,以压缩人力成本和降低风险。迁移过程采用小步快走的方式分批交付,以最长两周作为一个迭代周期进行交付。
「数仓」早已经不是原来的「数仓」了
本文讨论了Data Engineering中的数仓概念、OLAP引擎的作用以及数据湖的原因。数仓提供了数据集中存储和仓库建模的能力,用于描述业务并为分析决策提供服务。OLAP引擎是数仓的加速层,解决了底层基础设施的实时写入和查询速度问题。在选择OLAP引擎和HDFS存储时,需要考虑仓库建模和分析需求,以及OLAP引擎的能力特性。数据湖是为了统一存储半结构化和非结构化数据,并通过各种Table Format实现行列存储和原子操作的能力。
关于错误码的那点事
支付系统中存在两套错误码系统,导致定义混乱、冲突等问题。新系统的错误码规范未考虑整合带来的问题,导致部分错误码重复且语义不同。因此,需要重新定义错误码规范。目前钱包一的错误码是6位的,首位表示错误类型。重构后的版本错误码增加到了7位,导致系统中的接口层出现混乱。钱包二的错误码定义相对较好,但定位具体错误不容易。当前支付系统错误码存在字段类型不一致和重合问题。调研了多家公司的API规范和接口定义,以寻找适用于支付系统的错误码规范。
利用 JuiceFS 实现 Flink 动态镜像
Flink是一种流处理框架,广泛应用于处理PB级数据。在知乎内部,他们使用Flink处理数据,采用Flink官方提供的native kubernetes部署方式。为解决HDFS的痛点,他们将依赖存放在分布式文件系统中,容器启动时下载进容器,并根据依赖的稳定性进行分类。任务启动流程包括依赖注入和任务启动。这样可以避免Namenode压力过大、跨数据中心拉文件和一些特殊任务不依赖HDFS的问题。
istio 在知乎大规模集群的落地实践
知乎进行了容器化部署,拥有2000多个微服务。然而,由于基础组件维护成本高、语言客户端特性难以统一和版本迭代困难等问题,他们选择了拥抱社区和ServiceMesh来解决这些问题。ServiceMesh可以提升微服务治理能力,减少维护投入,提高通信速度,并具备故障注入和动态服务路由调整能力。知乎的迁移方案需要满足业务无感知迁移、可回滚、高可用和性能不下降等要求。为了实现这些目标,他们设计了一个流量互通方案。
TiDB x Flink 数据集成实践
知乎使用了开源分布式关系型数据库TiDB,用于替代MySQL解决扩展能力问题。为了解决数据分片导致的数据版本不一致和分区字段连续性问题,在数据集成平台中,知乎基于Flink构建了实时和离线的数据同步及清洗功能。这样,用户可以将不同数据源的数据导入到相同的数据源中进行进一步分析处理。然而,使用flink-jdbc-connector时仍存在数据分区设置不智能和唯一键约束字段不连续的问题。
Protobuf 在知乎大数据场景的应用
Protobuf是一种跨语言和平台的序列化数据结构的方式,具有高效和灵活的特点。在知乎大数据中,Protobuf主要应用于数据入仓和数据出仓的场景。然而,使用Protobuf存在一些问题,如开发门槛高、代码维护困难、发布上线流程长等。为了解决这些问题,提出了开发通用的Protobuf处理工具。其中,针对Protobuf入仓的场景,开发了Flink Protobuf Format,可以将解析后的Protobuf数据落入任意数据源。摘要:Protobuf是一种序列化数据结构方式,在知乎大数据中应用广泛。为了解决使用Protobuf的问题,开发了通用的处理工具。其中,Flink Protobuf Format用于处理Protobuf入仓场景,实现了Protobuf数据的解析和落地。
HDFS EC 在知乎的应用
HDFS引入纠删码技术以降低冗余数据成本。纠删码文件可在部分损坏时解码出可靠数据。HDFS的EC编码分为XOR和RS两类,节省存储的比例不同。但EC也存在性能问题,读写性能较3副本差,且EC文件不支持修改操作。根据数据的冷热程度进行EC策略选择,倾向于对较冷的数据进行EC,以减少频繁读取/刷数对集群的影响。冷热文件分级由文件的产出时间、访问时间和访问频次共同决定。产出时间较近且频繁访问的文件标记为热文件,反之标记为冷文件。
知乎 HADOOP Yarn Federation 跨云多机房调度实践
知乎进行了关于HADOOP YARN跨云多机房集群架构部署的调研工作,发现单集群打标签方式无法解决ResourceManager负载过高的问题,对多机房多集群和YARN Federation提出了选择。YARN Federation是未来的方向,可以配合HIVE/SPARK进行管理,配置信息一致,运维成本低。而YARN多机房多集群方案操作简单,开发工作少,但需要客户端修改配置,维护成本高。综合考虑,YARN Federation是更可行的选择。
知乎k8s在离线混部-离线篇
知乎为解决离线集群资源不足问题,采用Hadoop YARN服务在在线环境下部署,并使用YARN Federation架构来管理集群的搬迁和任务迁移。这样可以提高在线集群资源利用率,降低离线集群的超负荷运转。在离线混部过程中,需要解决技术选型、数据完整性、在线集群稳定性、任务平滑过渡和配置管理等关键问题。知乎在2022年选择了YARN Federation架构,以满足业务对接简单、集群变更对业务无感知、架构可复用等需求。详细架构图请参考官网链接:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/Federation.html。
知乎k8s在离线混部-在线篇
知乎通过应用混部技术实现了大规模部署,但在离线混部过程中面临问题。为了成本优化,知乎采取了系统化资源利用提升和静态资源潮汐调度等手段。系统化资源利用提升通过建立数据和应用指标,通知应用方降低配置,优化资源利用。静态资源潮汐调度则解决了K8S调度不均衡和资源碎片问题,实现了真实资源使用的调度。这些方法在不同阶段使用,帮助知乎优化资源利用和降低成本。
Alluxio Fuse 在知乎的实践与优化
Alluxio Fuse是一种数据编排技术,可以将Alluxio上的数据挂载到操作系统本地,方便访问分布式存储上的数据。然而,使用Alluxio Fuse存在大文件读取速度不理想的问题。通过研究和debug,发现问题出在libfuse每次交换数据量最大为128KB的限制上。用户请求读取1MB的文件会被拆分为8个128KB的请求,导致读取速度慢。为了优化Alluxio Fuse的读取速度,需要解决这个限制。
知乎效果营销平台前端工程治理
知乎效果营销平台面临开发环境复杂和单仓库多应用的问题。为解决这些问题,文章介绍了开发环境自动化流程设计,包括搜集启动进程参数、自动签发本地https证书以及使用webpack-dev-server代理到目标环境。使用控制台交互工具inquirer来确定代理目标环境和对应域名。这一解决方案有助于提高开发环境启动效率和工程治理。