架构
豆瓣整个基础架构可以粗略的分为在线和离线两大块。在线的部分和大部分网站类似:前面用LVS做HA,用Nginx做反向代理,形成负载均衡的 一层;应用层主要是做运算,将运算结果返回给前面的用户,DAE平台是这两年建起来的,现在大部分豆瓣的应用基本都跑在DAE上面了;应用后面的基础服务 也跟其他网站差不多,MySQL、memcached、redis、beanstalkd,不一样的是NoSQL的选择——BeansDB,这是我们在几年前开源的KV数据库,也是国内比较早开源的KV数据库。
BeansDB项目可以说是一个简化版的AWS DynamoDB,该项目在2008年启动,2009年开源,第⼀版使⽤tokyo cabinet作为存储引擎,2010年使⽤bitcask存储格式重写了存储引擎,性能更好。BeansDB对key做哈希运算找到节点来实现分布和冗 余, 一个写操作会写好几个节点,而现在的配置是写三份读一份。BeansDB主要的特点是支持海量KV数据库——相比Redis这种支持几十个G到几百个G的 内存KV数据库,BeansDB可以支持到上百T的数据。另外BeansDB最大的好处就是运维很简单,性能、可用性、扩容都很好,也实现了最终一致性。
BeansDB中间的Proxy是用Go语言写的,也是一个开源的组件。整体来说BeansDB的设计结构比较简单,相比Redis那种有多种value类型的方式,BeansDB的value比较简单一些。
在豆瓣内部建立了两个不同的BeansDB集群,一个是doubandb,一个是doubanfs,分别针对不同的场景。 doubandb主要 存储小型文本数据,如影评、用户个人介绍、帖子内容等,这样的好处是可以大大降低我们对MySQL的性能依赖,算是给MySQL减负;doubanfs主 要存放图片和音频等中型数据。
DAE可以说是基于很多以前积累的、旧的组件做起来的。我们做的这种对内的PaaS,相比对外的PaaS而言做了很多简化,尤其是安全方面如应 用间隔离、权限管理方面,我们都不用像公有云那样花大量精力去做,所以工作量其实还好。DAE现在在计划开源,当然它现在只支持Python应用。以后我 们也许会让DAE支持Go语言。
上面是在线的部分,对高可用性和低时延有较大要求。离线部分则包括数据挖掘、数据分析等,技术组件分别是海量分布式文件系统 MooseFS,这 个文件系统的结构类似HDFS,用C语言编写,其好处在于FUSE模块实现的比较好,用文件系统就可以直接进行操作,而不需要专门的命令,可以支持的数据 量也很大。另外就是自己开发的分布式计算平台DPark。
DPark顾名思义是Spark的Python实现,不过现在已经跟Spark越来越不一样了。和Hadoop 相比,Spark可以使用内存做为缓存加速分布式计算,DPark继承了这个优点,这对于大规模数据的迭代计算非常有用。在豆瓣的应用场景下,因为我们的 离线计算很多是推荐算法计算,这种计算涉及大量的迭代算法,如果每次计算的结果都入磁盘再在下一轮计算加载,那性能是很差的,所以DPark能够大幅提升 性能。另外,因为DPark的编写使用了函数式语言的特点,所以可以写的非常简洁:
到目前(2014年3月),DPark的集群规模和处理数据量已经比去年多了一倍左右,一天要处理60~100TB左右的数据。
团队
当前,我所负责的豆瓣平台部一共包括四个部分:核心系统,这块也是由我直接带领的,共6名工程师;DAE,现在是彭宇负责,共4名工程师;DBA两人;SA两人。
平台部负责的项目大多是跟业务无关的东西,贴近应用层的主要在产品线团队做,这个分工跟豆瓣工程团队的发展历史有关。早期豆瓣工程师还不多的时 候,就已经分为两种倾向,一种是偏业务的,就是去做用户能看得见的东西;另一种是支持性的,运行在业务层下面、不被用户所感知的东西。下面这一层就衍变成 了平台部门。
在豆瓣,不管是做产品还是做平台的工程师,技术实力都比较强,一个项目应该从哪个部门发起,并不是看这个任务的难度,而是看它是公共的还是业务 特有的。有些项目即使未来可能会成为公共的,但一开始只是一个产品线需要,那么它也会从产品线发起。比如豆瓣的短信服务,最开始是产品线有需求,所以这些 服务都是由他们发起完成的,平台这边主要负责提供建设服务的架构,比如DoubanService,告诉他们一个服务怎样去写、怎样去部署、怎样去对用户 开放。短信服务后来成为很多产品线都在使用的服务,同时这个系统本身也越来越成熟,那么它逐渐就被转移到SA团队来进行维护。
核心系统组做过的项目,包括刚才提到的DPark、BeansDB,还有MooseFS这些二次开发的,还有搜索服务、信息推送的长连接服务等,大大小小差不多有十几个。有些项目处于维护状态,所以需要的人不是那么多。
跟豆瓣其他工程团队一样,平台部也强制大家做code review。这对于核心系统来说很重要的一点在于,code review是一个知识共享的过程:我们人少项目多,所以很多项目都是一个人做主力,很容易就变成其他人不知道你这个项目具体是什么情况,而强制code review就可以实现一种公开透明的状态,让大家都了解每个项目在做什么。
在平台部,因为你做的所有东西都会影响到全公司,测试显然很重要,我们还做了另一件事来进行质量保证,那就是一个项目由谁来主导上线,谁就要负 责这个项目的故障响应——所有运维、调整系统等SA的工作,你这个第一负责人都要参与。你做的东西的好坏会影响到自己晚上能不能睡好觉,所以大家就会比较 谨慎。灰度上线也是我们这边的通用做法。
平台部还有一点跟产品线不一样的是,平台部没有产品经理,所以你的工作方向更多是自己去找的,每个人自己发现问题的能力更重要。我们每个月都会问大家,你这个月想要解决什么问题?如果方向大家一致认可,那就去做。
最后,对于新技术的引入上,豆瓣整体是比较偏激进的,我们鼓励大家去看看新的技术。当然我们也不会看到新的就上,这里面有一些限制:一个是比较 重要的服务如果要上新的技术,一定要有成功案例,且成功案例有跟我们量级差不多的规模,这样可以降低风险;另一个是对于引入的新技术一定要吃透——大部分 引入的技术肯定是要做二次开发的,所以拿进来的技术你必须保证能完全理解它的代码结构,出了问题能修,能去掉自己无法掌控的东西。这也是为什么豆瓣不太可 能在重要的地方引入Java的原因,除非别无选择,我们一般都是Python、C和Go。
相关推荐
豆瓣,作为一家知名的互联网公司,不仅以其独特的文化氛围闻名,同样在技术架构和组件方面也有所创新和贡献。在CTO俱乐部北京举办的第99期主题活动中,豆瓣的首席架构师洪强宁介绍了豆瓣的技术架构和自主研发的几个...
本文将深入探讨豆瓣网的技术架构变化,包括早期的基础架构、应对高并发的解决方案、数据存储与处理、分布式系统以及持续优化等方面。 在早期,豆瓣网的技术架构相对简单,主要基于LAMP(Linux、Apache、MySQL、PHP...
首先,我们要讨论的是iOS应用程序的基础架构。在iOS上开发应用,通常使用Swift或Objective-C作为编程语言。这个项目可能使用其中的一种,考虑到Swift的普及性,很可能采用Swift。开发环境通常是Xcode,它集成了代码...
首先,我们要理解微信小程序的基础架构。它基于JavaScript,结合了WXML(WeChat Markup Language)和WXSS(WeChat Style Sheets)两种特殊的语言,分别用于定义界面结构和样式。WXML负责页面的结构布局,类似于HTML...
1. **基础架构**:微信小程序基于JavaScript、WXML(WeiXin Markup Language)和WXSS(WeiXin Style Sheet)构建。WXML负责数据绑定和结构布局,WXSS用于样式设计,而JavaScript则是处理逻辑和交互的核心。源码会...
总的来说,豆瓣相册iOS应用的开发涵盖了API交互、网络请求、数据模型、UI设计、图片处理、架构设计等多个方面,涉及到的知识点丰富多样,对开发者的技术要求较高。通过这样的应用,开发者不仅可以提升自己的技术能力...
开发者可以借此机会深入了解Web服务的架构设计,学习如何处理用户交互、数据存储和检索,以及如何构建社交网络的核心功能。同时,也可以借此机会锻炼自己的代码组织和项目管理能力,提升到更高级别的软件开发水平。
- 不懂运行,下载完可以私聊问...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
2. **MVC模式**:豆瓣网源代码可能采用了Model-View-Controller(MVC)架构,这是一种软件设计模式,将业务逻辑、数据处理和用户界面分离开来,有利于提高代码的可读性和可维护性。 3. **数据库管理**:豆瓣网涉及...
这个源码集成了豆瓣网的主要功能和架构,供开发者研究、学习或者作为开发类似网站的基础。 【描述】:“豆瓣网PHP5版整站源码”是一个用于了解和分析豆瓣网站实现方式的资源。它包含了网站前端和后端的所有代码,...
1. **微信开发者工具**:首先,你需要熟悉微信开发者工具,它是开发小程序的基础,提供了代码编辑、预览、调试和发布等功能。通过这个工具,你可以实时查看代码效果,进行调试和优化。 2. **小程序架构**:微信小...
在本项目中,Spring Boot作为后端基础架构,提供了微服务的开发模式,方便构建RESTful API,同时集成了自动配置和健康检查等功能,使得项目启动和运行更加便捷。 2. **Jsoup** Jsoup是一个Java库,设计用于处理...
微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、...同时,这个案例也提供了学习和研究豆瓣电影应用架构的机会,对理解电影信息展示、搜索、评分等核心功能的实现大有裨益。
【小程序豆瓣视频实例】是一个适合初学者...总的来说,这个【小程序豆瓣视频实例】是学习微信小程序开发、前端技术以及API调用的实用案例,通过实践,初学者能够掌握小程序的基本架构和开发流程,提升自己的编程技能。
在深入探索Android豆瓣客户端源代码之前,我们先来了解一下Android开发的基础知识。Android是一种开源的操作系统,主要应用于移动设备,如智能手机和平板电脑。它基于Linux内核,由Google领导的开放手机联盟进行开发...
首先,我们要了解微信小程序的基础架构。它基于JavaScript,但使用了自定义的WXML(WeiXin Markup Language)和WXSS(WeiXin Style Sheet)作为视图层的描述语言。WXML负责结构,类似于HTML,而WXSS则处理样式,类似...
首先,我们需要了解Android应用的基础架构。Android应用程序主要由Activity、Service、BroadcastReceiver、ContentProvider和Intent等组件构成。在豆瓣应用中,Activity通常用于展示用户界面,如书籍、电影的浏览...