日前,笔者采访了小米研发架构师欧阳辰,负责小米广告平台的架构研发,在本文主要分享了小米广告平台的架构思路、构建过程、底层模块、遇到的坑、未来的挑战等,以及谈了对架构的理解和架构师成长的心得。
欧阳辰,毕业于北京大学计算机系,获得学士和硕士学历,拥有超过15年的软件开发和设计经验。之前曾为微软公司工作10年,担任高级软件开发主管,领导团队参与微软搜索引擎和广告平台的研发 工作,曾负责微软上下文广告的全部研发工作,包括系统架构和数据算法。之前为甲骨文工作3年,为甲骨文中国的第一批研发人员,从事甲骨文数据库和应用服务 器的研发工作。
他热爱软件开发行业,特别对于大规模软件的架构设计,具有丰富的理论知识和实践经验。
CSDN:请简单介绍下您和目前的工作,以及总结下您的职业生涯。
欧阳:我是欧阳辰,目前就职小米公司,担任架构师和研发主管,主要负责广告平台系统架构,广告交易系统研发和营销数据平台。之前在微软工作工作10年,带领团队从事互联网广告和搜索引擎的研发工作,包括负责微软移动上下文广告系统和数据算法,必应搜索引擎的Index Serve的性能提升,最早在甲骨文公司从事数据库的研发工作。
CSDN:你是如何走上技术这条路的?以及15年软件开发和设计经验的你是如何保持对技术的热情?
欧阳:从小我就对工程技术比较有兴趣,后来在北大学的也是计算机软件专业,自己也很喜欢,不断的学习新技术,不断的解决问题,把产品打磨好,实现业务目标,这可能就是一种简单的工匠精神吧。享受解决技术问题带来的喜悦感,学会努力获得更多人的支持,坚持不断的学习新技术,提升自己的认知,“好学近乎知,力行近乎仁”。如果是内心热爱,保持对技术的热情就不成大问题,但有的时候也会迷茫,这时候设定好自己发展的目标(短期和长期),珍惜当下,往往能够帮助你更好的坚持和努力,不忘初心,方得始终!
CSDN:可否介绍一下目前小米广告平台的技术团队规模和结构是怎样的?
欧阳:小米广告平台是小米移动互联网广告的技术平台。广告的媒体包括小米应用商店、新闻资讯、视频、浏览器、小米电视等众多优质资源,也包括一些知名第三方应用;广告形式包括应用分发、信息流、电商广告、开屏、视频前贴、小米主题等多种形式。
研发团队大约几十人人,人数还在持续增长,不断有广告行业技术专家加入我们。研发部门按业务目标划分,可分为媒体方、系统架构、策略算法、广告主服务和数据平台。媒体方组负责媒体变现最大化,系统组负责架构演化和可靠性,策略算法组负责提升点击率、相关性等,广告主服务负责提升广告主满意度和ROI,数据平台提供数据洞察和营销数据平台DMP。
CSDN:能简单说说小米广告平台目前支持的业务的数据情况么?
欧阳:小米已售出超过1.5亿的智能设备,日活跃用户超过亿部,小米电视和盒子销售也近千万,小米手环和各种智能设备也是行业领先。在这个大背景下,小米广告也在通过“取势、明道、优术”的方式快速增长,聚焦在移动广告方向,最大化媒体的变现能力和广告主的满意度。例如,我们的应用商店媒体,最高日下载应用超过8000万,同时应用商店分发渠道也是开发者推广的首选高质渠道。另外,小米内置的新闻资讯产品日活跃也近千万,信息流广告也是十分受到欢迎的广告形式。
CSDN:能不能详细介绍一下这个平台架构的架构设计思路?
欧阳:世界上本来没有思路,踩坑踩多了,也便成了思路。广告平台的设计思路是从几个方面出发:
- 首先是对于目前业务和未来业务的深刻理解,我一直坚信架构是为现在和未来的业务服务的,减少业务变化而引入的成本,在设计理念上我们更愿意按照业务分解系统,特别是将需求多变的业务模块隔离出来,减少耦合。
- 其次,架构设计需要和团队的组织方式是一致的,遵守康威法则,例如在我们平台建设初期,各个业务小组都飞速发展,放马狂飙,那么架构需要提供足够的灵活性。
- 另外,广告系统对于可靠性要求非常高,不仅仅涉及到用户体验,也涉及到业务收入,因此系统的预警,报警和错误排除都需要大力投入。广告系统也有业务驱动的特点,不同的广告业务可能需要不同的系统架构来支持,因此架构的扩展性和可演化性也是非常重要的,需要支持业务的小步快跑,敏捷式迭代。
CSDN:可否详细介绍一下这个平台架构的构建过程?
欧阳:平台架构的过程实际上是一个演化的过程,每一步演化都是为业务服务的,我自己总结一下可以分为四个阶段,分别是”加、减、乘、除”。
- 第一个阶段是加法,不断的上线新业务,整个系统不断复杂化,结果造成各个业务之间耦合很厉害,在后期,每一次设计涉及的影响都很大。
- 第二个阶段是减法,为了解决第一阶段的问题,系统的解耦成是一项最重要的工作,将各个模块独立出来,服务化,减少各个模块之间的不必要的联系。
- 第三个阶段是“乘法”,这一阶段的业务发展脉路较为稳定,各个模块分解的比较合适,各个模块(服务)都可以利用各种技术,高速提高服务质量,例如数据处理方面,通过流式处理,大大提高及时性;算法模块在解耦后,也大大提高了算法上线的速度和种类;架构服务化后,系统的容量和可靠性也大大提高。
- 最后一个阶段是“除法”,整个系统变得非常大且复杂,开发人员也有近5倍的增长,部署的机器也有近10倍的增长,服务模块数量也超过20个,这时候架构的调整涉及到一些抽象,按照业务分为服务群,对于离线的数据流也进行了大规模的优化,整合了一些分散的小模块,使得整个系统更加简单。
值得分享的经验是,架构师的工作不是创建一个静态的,美丽的架构蓝图,更多的工作是在成本、质量、收益和速度中找到长期技术投入的平衡,其目标是支持业务的快速发展。
CSDN:小米广告平台具体模块的底层如何实现的以及它们的作用是怎样的?
欧阳:小米广告平台的一些重要模块包括广告索引服务,点击率预测和排序,数据平台模块等。
- 广告索引服务是将广告主投放的广告进行索引,以方便查找,为了提高检索效率,自己编写了倒排表功能部分,部分索引也使用了Lucene作为引擎,这一部分的挑战主要是广告数据的更新需要实时同步到索引中去,通过索引的更新或者新老索引的切换来完成,并且保持数据的一致性。
- 点击率预测和排序服务主要是对于每一次广告请求,把候选的广告列表进行点击预测,支持各种算法的快速上线和实验,随着算法种类和特征数据的增加,计算和内存变得越来越紧张,水平扩展是非常重要的工作,另外就是特征数据的实时性,从最开始的一天,几个小时到现在的几分钟。
- 数据平台模块是广告系统中非常关键的模块,其中包括反欺诈监测、商业智能和报表系统,主要目标是帮助广告主算好每一分钱,并且提供足够的洞察,帮助广告主更好的规划预算和效果监测,其中还涉及到精准营销的数据平台DMP。
CSDN:开发中遇到了那些坑,又是如何解决的?
欧阳:开发过程中踩坑是不可避免的,关键是能从踩坑中吸取教训,不要第二次踩到同一个坑。架构设计上,我个人收获到很重要一点就是:架构及演化一定要坚持为业务服务。
- 举一个大坑的例子,一年前刚刚接触这个平台时,当时感觉平台的层次不清楚,各业务之间的重复性很高,很多代码不忍直视,我的第一个直觉就是需要一个周全的架构,统一化的广告检索,可扩展的广告检索元语言等,基于这些想法和过去多个广告平台的经验,设计了一个广告演化的目标架构(所谓蓝图),有些模块沿着这个思路开始了重构工作,有些模块并没有重构,沿着老路发展,半年以后,我们再回首当时的决定。当时重构的模块是业务相对稳定的模块,后期的业务并没有从其中得到太多直接好处,虽然代码很整齐,设计很规范,但是投入和产出比很低; 对于没有重构的一些模块,在各个新业务的冲击,打磨和碰撞下,不断的进行自然演化,反而成为最适宜业务变化的模块,回想过来,其中的很多设计都不是当初能够规划出来的,因为很多新业务都未到位。
- 再聊一个技术的坑,也不一定算坑,关于MySQL的,在项目初期使用MySQL一直很顺利,读访问量大了,就采用、读写分离;写访问量大了,就进行垂直拆库(分表);数据量继续增长,然后进行水平拆库、水平扩展、引入代理层;然后数据量又长大了,不得不将部分数据移植到HBase里去。整个过程中,我们在MySQL折腾了太多的时间,每一次数据库改进都需要花不少人力,而且容易出错,每次的工作成果只能维持很短的一段时间,总结出一个简单道理, 如果有机会再重新做一次,我会更早的拥抱NoSQL的解决方案,避免在MySQL上很多无谓的投入 。
CSDN:目前,面对的最大挑战是什么?
欧阳:目前工作的挑战有两方面:首先是支持业务的多样性和速度,系统需要十分灵活的架构快速支持各种媒体,各种广告形式和对接不同系统;其次,如何更好的发挥数据的价值,帮助广告受众提升用户体验,帮助广告主提升ROI,帮助媒体最大化变现,这些工作都在积极的开展,技术和业务的挑战都很大。
CSDN:最后,能否对那些立志于成为架构师的工程师说点什么?
欧阳:首先每一个架构师都应该是一个好程序员,好好编程,不怕踩坑,多多总结经验。其次,走进架构师,了解架构师的工作,架构师并非只是用来创作架构蓝图的,平日很多工作,都是通过数据驱动的方法,找到系统的核心问题,并且解决这些疑难杂症,很多时候需要在成本、速度和质量之间做优于业务的平衡。最后,提升自己的综合能力,包括知识领域、沟通能力和数据洞察力等,架构师很多时候需要通过数据,说服很多人,以推动项目前进。
我想对这些工程师说,成为架构师的路,是一条很长的路,道长且阻,行则将至,加油。