IT技术博客大学习 共学习 共进步

中大型移动互联网公司技术架构选择

五四陈科学院 2014-12-02 00:04:44 累计浏览 4,062 次
本机暂存

总体思考

总结这些年经验,进行构架演进的方向选择时,大致要做到下面的目标:

  • 可快速开发部署 (五分钟写出来一个经过测试的hello world并可访问/调用,并可在公网访问)

  • 天然可扩展(业务层无状态,尽可能全部放到最后)

  • 自动化(内存不足了,除了报警,应该自动加点机器进去; 新的项目,基础代码应该都不用写,自动生成即可)

  • 框架化(公共层面的东西尽可能框架化,一层类似日志、counter、trace,应该不需要开发再写一行代码即默认打开)

  • 量化(所有的调用都应该有percentile与rps,透明反馈服务质量,跟踪系统更是可以模拟用户进行系统内部)

  • 同构化(因为搞两套的成本巨大,整体应该越来越趋同于同一种语言)

  • 硬件虚拟化(整个平台应该对进程透明下面的硬件情况)

  • 版本化、灰度化(所有的软件都应该在线上有明确的版本,且上线过程是一点点灰度上)

  • 中大型移动互联网公司技术架构选择

    上图纯手绘花了些时间,本文以此图从上到下的顺序进行描述。

    用户

    在移动互联网环境下,用户会被分为好网络的用户和坏网络的用户,我们要为坏网络的用户尽一切可能提供合适的链路和可靠的DNS。

    接入层

    在接入层的代码层面,需要准备client-server套件,这意味着,需要一个同时了解android\ios..等客户端和服务器端开发的团队,专门打造网络套件。

  • 这一层的目标是,让客户端开发人员不再关心网络协议的问题。

  • 业务接入层

    这一层的目标是灵通机动调配流量,往往大家的方案都是LVS,或者是F5等。更高大上一点,再上一些流量分析设备,在有突增的时候好用来找问题。

    业务层

    在统一的业务框架下,去完成各个灵活组织的BIZ逻辑,这里就涉及到异构系统对一个大型公司的影响。

  • 如果80%的人都在使用java的活,还是趁早全用java,因为意味着剩下20%用其他语言的同学,有可能要把这80%的同学做的基础全部实现一遍。

  • 异构必然会导致某些模块不能完美工作,比如后续的RPC、配置管理、监控报警、跟踪系统等等。

  • RPC框架与队列

    二者一起完成数据在IDC的传递,不同在于,一个是同步,一个是异步。

  • 统一的RPC框架好处不必言说。

  • 配置管理

    zookeeper当选最佳角色,上点规模的服务里基本都会有zk的身影。

    日志系统

    统一的日志系统,对未来发展中所需要的各种数据更加容易得到。日志系统的特点要求:快,容网络错误,部署简单,进程稳定,可水平扩展。

  • scribe与kafka都是不错的选择。

  • 这里最终的日志,可能会需要放到hdfs或者是hbase里进行hive查询,否则数据量大了之后要想把日志用起来很不容易。

  • 监控报警系统

    ganglia与nagios仍旧是最好用的开源管理软件。

  • 需要考虑的是,要将在业务框架里默认记录的公共的perfcounter进行监控与报警。

  • 跟踪系统

    当系统出现bug的时候,用来快速debug,当服务越来越多的时候,跟踪系统是个必不可少的工具。

  • twitter的zipkin是个不错的开源的实现,不过要使用到自家的代码里来,可能要加工一下。

  • PAAS Agent Daemon

    整体统一的运维平台的客户端程序,此程序负责:向监控系统汇报硬件及网络数据,启动和停止应用程序,向监控系统和PAAS平台传递应用程序的运行状态。

    存储平台

    此层包括所有重状态的hosting service。

  • memcached cluster,使用统一的一致性hash客户端,所有的缓存服务器进行统一管理,计算命中率、使用率,实时添加内存。

  • DBMS cluster,使用统一的数据库分库分表层,动态地感知和切换故障。常见的项目如mysqlproxy,变形虫。

  • HBase cluster,独立的存储可用性保障,本身也是设计为高可用性的集群。

  • PAAS 资源控制层

    目标是实时反馈整个或多个IDC内部的内存还有多少、CPU是否够用、下次采购还需要多少机器。

  • 虚拟化是个重点难题。常见开源软件:docker、warden、LXC。

  • 资源控制CPU可用cgroups,磁盘可用aufs等,一般的虚拟化方案中都已经包括这几项解决办法。

  • PAAS用户界面层

    这一层主要面向运维和开发人员,比如用来上线服务、添加删除机器。

  • 除了web界面,还应该有cli模式的支持。

  • 自动部署层

    一般都以hudson的CI(持续构建)完成之后进行,但可自动化的部署一定需要测试框架非常靠谱,以及测试代码靠谱,否则就是个悲剧。

    测试框架

    借用一些高级框架,让代码写少一点,比如jmockit、spring-test等等。

    编译工具

    java的maven为不二选择。编译好的包仓库,推荐nexus。

    代码生成

    开发人员不需要重复进行操作,只要框架是固定的,所有的代码应该都是可以生成的。只需要花精力去修改核心逻辑。

  • 这里比较抽象,可以用的办法比如做一个maven-plugin,让全部工程师都会用。

  • 不断地去升级这个工具,使其包括更多的可能的代码方式。

  • 代码质量

    在工程师的代码完成之后,跑一遍静态分析,可以提前发现一些问题,可以做成定期的模式,与持续集成放在一起。

  • 推荐hudson + maven + sonar三剑合一。

  • 代码及常规系统

  • 代码托管:gitlab是一个不错的类似github(越来越像了)的工具。

  • codereview:可直接使用gitlab的merge request,也可以使用开源的reviewboard。

  • 知识管理:没什么好说的,mediawiki。

  • 需求与bug:jira。

  • 故障管理:这个没有开源项目,post-mortem system,是一种记录故障原因的系统,下一次故障来临的时候,来这个系统里进行问卷式的调查和反思。

  • PAAS for DEV & TEST

  • 开发阶段需要之前提到的cli可发布到自己的开发机(这里还需要PAAS可很容易地开一个新的开发机)的工具。

  • 测试阶段需要比开发阶段更加高可用性的环境,而且要时刻提升基础工具的可靠性,不应该让开发环境在发展中消失,反而用测试环境来当作开发环境,现实中发生此类事件的原因,都是部署没有做到完美。

想快点找到作者也可以到Twitter上留言: @54chen

或者你懒得带梯子上墙,请到新浪微博:@54chen

建议继续学习

  1. 公司倒了,请让领导先走 (累计阅读 13,341)
  2. 个人开公司的流程,以后用得着 (累计阅读 7,862)
  3. 谷歌是如何做代码审查的 (累计阅读 6,602)
  4. 一个程序员的血泪史 (累计阅读 6,181)
  5. 加班与效率 (累计阅读 6,103)
  6. 献给有裸辞想法的朋友们 (累计阅读 5,482)
  7. 大公司与风险管理 (累计阅读 5,242)
  8. 从Code Review 谈如何做技术 (累计阅读 5,103)
  9. 软件测试工程师的职业素质 (累计阅读 4,941)
  10. 互联网的人才储备 (累计阅读 4,921)