[关闭]
@chris-ren 2016-08-27T08:24:52.000000Z 字数 13174 阅读 1171

依靠“全方位”的云服务,初创产品的快速迭代和“云端”优化之路

未分类


房玉峰:大家好,感谢今天有机会可以跟大家分享一下三年来我们的产品从无到有的过程。刚刚七牛的朋友分享了七牛的整个直播,其实我们也是七牛的客户,因为我们从产品第一天开始上线就依赖于各种各样的云服务,所以今天刚好趁这个机会和大家一起来看一下,这三年的过程中我们是如何利用一些云上的服务来快速迭代以及演进我们的产品的。

首先介绍一下我自己。在IT行业混了十年,几乎从来没有在任何大会的场合来分享自己的经验。我在群硕差不多做了十年,2006年毕业就加入这家公司。十年的过程中做过了很多企业级的项目,比如美国的Motorola公共安全系统,它是美国的911系统,现在已经在美国的几十个城市上线了。它是一个公共安全领域方面的系统,相当于说你在整个城市任何一个地方,如果出了一些火警、抢劫这种事件后可以通过这个平台快速调度你周边的消防员、警察。这是一个很大型的、企业级的一套软件系统。

我后面做过CNTV国家网络电视台,当时我是带了一个团队在北京做了将近一年多的时间,和央视整个团队一起构建CDN节点、转码队列以及整个视频分发的系统。这次来北京又和央视的朋友在聊,他们告诉我很快就会把之前构建的视频转码系统迁移到七牛上面了,我觉得这也是云带给我们的一个转变,当年的团队做了很长时间,到现在有一些更好的云服务之后,他们也会做一些这方面的转变。后面也做过第一财经、SMG等,帮他们构建了新一轮的管理平台和第一财经的手机客户端。

然后,又做了移动车辆管理系统,这是美国的一个大型系统。因为美国有很多的法案,所有的卡车只要在公路上跑,必须符合美国的一些法律法规,所以我们就会有一些小型的设备连在卡车的引擎上面,实时收集所有卡车引擎的数据,这些数据会通过这些设备传输到智能手机终端上,然后把这些数据再实时传回到后端的SaaS平台,相当于是一套从移动终端到整个SaaS平台一体化的系统。现在我主要负责群脉SCRM SaaS平台,带着团队差不多做了将近三年时间,这也是今天和大家分享的一个重点。

简单介绍一下我们的产品,因为后面会讲到在云服务上的架构演变都和这个产品有关系。

微信出来以后改变了很多人的生活,站在我们自己的角度,微信除了是和朋友交流的工具,也是我们每天看文章或者订阅资讯一个新的阅读方式。比如你去餐厅或者去商场,你只要扫一个码就会给你优惠,这是站在我们用户的角度来使用这个平台。

站在企业的角度,整个微信对他们的冲击还是很大的。以前可能你买一个冰箱也好或者买一个空调也好,然后你扔在家里就算了,这些服务商是没办法真正触及到你的。但是因为微信的出现给这些企业很多的机会,用一种新的方式来触及到自己的客户,通过一些公众平台上的交互,比如我的产品出了问题,我需要客服支持,我需要预约整个售后的过程。站在企业的角度会看到,这个客户和我互动过多少次,购买我的产品出现过什么问题,他对哪方面的东西比较感兴趣,对整个企业来说相当于增加了一个新的渠道来触及到自己的客户,也方便他日后的营销以及客户经营。群脉就是这样的平台,我们帮很多大的客户群,像联合利华、日赢、永达、上海迪士尼都在使用这套系统来做他们的客户管理和日常运营的工作。

我简单介绍一下联合利华的故事,在没有微信之前或者说没有这种工具之前,联合利华每年和批发商的管理全部是通过电话或者其他一些比较古老的方式。他有二级经销商、三级经销商,这些经销商每天都有计划,我希望今年向联合利华进行多少采购以及采购达到目标之后每年会给你多少折扣。去年他们把整个经销商的管理平台全部迁到微信上,经销商在微信里面可以直接进行整个产品的采购以及季度的汇报,甚至到年底时候一些返利的执行。还有每年在联合利华的调味料瓶子上面都会印二维码,之前所有的厨师只要用到联合利华的商品,就会把二维码揭下来放到信封里面寄给他们,他们收到之后把返利返回去,现在都是通过微信的二维码。每年在年底的时候说某个品牌有1亿的出货量,需要1亿张二维码,他把二维码提前准备好,直接发给这些厂商,他拿到东西以后打开微信关注扫码,然后完成整个对厨师的优惠或者说折扣的返现。

此处输入图片的描述

接下来我会介绍一下,三年里面我们的产品整个架构上面的三次转变。1.0就是两三年前,我们是一个很小的团队,我们唯一的目标就是要快,希望可以生存下来。把我们之前自建的机房开始往云上做迁移,我们希望我们的研发团队可以快速的利用云服务来加速我们整个产品的迭代。

在2.0的时候,差不多一年之后我们有很多客户进来,不断有各种各样的需求进来,我们也经历了一个快速发展的过程。所以在2.0我们就会遇到很多很多技术上的一些问题,这些问题有些我们是可以通过架构的重构来解决,有些很多的问题我们会优先利用云上的方案,云上的一些技术或者说其它的一些SaaS服务,让我们能快速的解决我们当前的问题,这是2.0的现状。简单来说就是借助云的一臂之力快速的迭代以及演进产品

不管1.0还是2.0,其实我们都是在做1+1等于2的事情,有一个客户需要10个人,来一个新的客户可能就是20个人。3.0也是我们现在在思考以及正在做的事情,我们希望做一些1+1可以大于2的事情,用一个小的团队来服务于多个客户。这个阶段我会有一些想法和大家简单分享一下。

一、产品架构 1.X

在1.0版本,我们开始从自建到云的转变,很重要一个就是团队因素。三年前互联网大潮在中国蓬勃发展,我们也希望加入,但是我们的团队并没有这方面的经验,不管以前我们是帮助SMG构建他们的整个软件平台也好,还是帮助央视CNTV做他们的平台也好,我们所有的模式就是帮你把软件做好。如果你希望用我们做好的软件来提供整个硬件的基础设施,那SMG的时候是我们帮他们一起,他们会寻找一些硬件厂商,会一起来建机房,最后把我们的产品部署到他们的机房里面。CNTV的时候也是一样,一起提一些硬件的需求,每一个节点里面需要多少台服务器,每个服务器是什么样的配置,所有这些方式都是我们在提供一些软件的服务,整个基建的建设是我们的客户在构建。对于我们来说这就是我们比较欠缺的一点,所以如果我们要快速的做我们的产品,这方面我们几乎是没有经验的。

另外一个就是需求的因素,我们要快,快了才能活下来。你不可能做两年的时间,最终才来交付你的产品。另外,在那个时间刚好国内的云环境开始起步,简单来说可能天时地利人和,这是好听一点的话,难听一点的话就是用云上的服务,我们是没有别的选择,就是被当时的现状所逼的。

昨天晚上和阿里云的朋友聊天,他问我说三年前你为什么会选择阿里云,我说你看现在阿里云发展得这么好,所以当年我们选择了阿里云。其实在那个时候我们也不知道,各个大的厂商都在做一些云服务,有阿里云、腾讯云、盛大云,Ucloud我们当时还没有听说,四五个月之后才知道有这家公司,以及新浪云。一个简单的评估,不管阿里还是腾讯都是大厂商,在国内他们是值得信任的。另外,我们觉得像淘宝和支付宝的这种模式以及他们在系统内的经验以后可能会慢慢的融入到阿里云上面来,应该会帮到我们。腾讯当年就是做QQ聊天,可能和我们的产品不太一致,所以我们就选择了阿里云,一直用到现在。

当时云的整个生态发展也算刚刚起步,又拍云、七牛云这些面向开发者发生的云的服务就开始萌芽。什么叫面向开发者发生?我们做SMG的时候,会去谈如何介入整个CDN,他们就是CDN,我把文件放上面就可以了。当时我们有一个很强的需求,我们的图片怎么办?我们的图片有不同的尺寸,有不同质量的要求,按照以往的经验是一张高清的图上面做各种尺寸的剪裁和处理,每当有需求变化的时候,要把整个图片处理一遍,但利用这些云上提供的像开发者发生的东西就可以很好的支持我们,就一张最原始的高清图片就可以了,我在什么地方用,通过加一些参数实时做一些图片的展现就OK了。我们当时对云还是比较懵懂,认为和VPS差不多,就是不用买服务器、不用托管机房,这是在三年前比较懵懂的认知。

此处输入图片的描述

我们的架构也比较简单,那个时候云上面只有主机,所以所有的服务我们都构建ECS,我们都自己构建数据库和缓存。云服务是当时唯一的选择,对我们这种小团队来说只有一点,你需要整个系统没有单点,你需要的是模块化,当你的量上来的时候你只需要加ECS放上去就可以了。对于数据库很简单,开始的时候买一个4核8G的,量上来之后整个配置往上翻,能支持往前走就够了。

此处输入图片的描述

差不多几个月之后阿里云上会有一些新的服务,比较典型的就是有了负载均衡,有了日志服务,所以我们在云上做一些运维的时候会简便很多,有了一些数据的备份和存储的服务。

现在来回顾1.0之前的想法或者做法,就是比较快的开发,不管任何的产品需求,需要在最快的时间内完成上线。但是在运维上面我们是比较慢的,所谓慢不是它的部署驱动很慢,而是因为云上有一些便利的基础设施,所以我们在构建整个运维团队的时候节奏比较慢。一开始20个人的研发团队只有一到两个人做运维的支持就够了,我们满足当前的需求能正常的往前走。这是8/2原则,我希望在云服务的时候,只要能满足80%的需求就够了,可能有20%的需求满足不了,但是我比较看重这80%,它会极大的减少我开发的工作量,可以让我整个运维更方便,所以我就会用云服务,其他的20%我可以选择做一些折中。比如我们当时用SLB来替换Nginx反向代理的时候就会有很多问题,它不支持针对不同的路径做一些反向的负载支持,我们会选择一些方案,会加不同的域名,开多个负载均衡来达到这个目的。一开始我们会买一个很大的磁盘放在一起,我们所有的图片都往上丢,后来我们把整个图片的东西都托管到七牛上面来加速我们的迭代,为此我们会在整体的架构或者结构上做一些调整,但是我们愿意付出这样的一些工作。

虽然我们在云上用了这么久但它也不是一个云端,还是有很多问题需要注意。简单分享几个我们的经验。

二、产品架构 2.0

1.0我们开发很快,我们也遇到了很多问题,所以就有很多问题需要我们快速解决。比如开发速度慢下来,你就需要重新审视慢下来的苗头是什么?比如因为团队的结构,团队人数越来越多,我们整个代码的冗余非常严重,在数据层面我们整个数据的耦合也非常厉害,经常会出现一个问题修掉,第二天第三天上去之后客户又发现了其他相关的问题,大家处于一种救火的模式。所以我们就需要重新来看如何解决这样的现状。

另外,我们整个产品里面或者整个代码里面有很多小架构,所谓小架构就是指今天这个客户需要这个功能,这个功能就加上去了,那第二个客户他也需要这样一个功能,但他会有一点点不一样的地方,那第二个客户可能就会直接加一些Index,对团队来说是最好的方式,第三个客户Index可能解决不了问题,所以就会做一些抽象。比如我们有很多不同的功能模块,我希望能嵌到整个微信的菜单里面,我提供客服的他也需要,提供商城的他也需要,开始的时候我帮你加这个菜单出来,但到后面我们有一些预约、订票的系统他也需要,怎么办?我们就会做一些小的架构,就是定一些规范。当我们整个系统跑的时候我们会看,你的模块里面会有以什么文件名或者以什么格式命名的函数,我们会基于要求的数据格式反馈给我们,自动帮你加到某一个菜单去,这就是比较小的架构。这种小的架构散落在整个代码里面遍地都是。

而且,差不多一年多之后整个云上的生态发展非常快。云上出现了很多应用层面支持你整个研发的服务。所以当我们在解决1.0遇到的问题时,我们会重新审视哪些需要自己做,哪些云上的一些解决方案可能已经满足我们了,我们就会直接采纳这些方案。

因为我们的客户越来越多,为了快我们需要打磨一些通用的功能。可能在同一个行业里面,客户A也需要这些功能,客户B也需要这样的功能,我们会把通用的功能抽象出来,但是我又要针对大客户提供私人定制的服务。基于这样的变化或者策略,会驱动我们整个研发团队做一些调整。我们把整个团队从角色上分开,有一个团队是标准的产品,专注于解决在一个行业或者两个行业里面这些客户都需要的通用功能。对于比较大的客户有一些定制的需求,我们有专门定制的团队来支持。刚刚已经讲过了云上的各种生态刚好有各种各样的服务,所以在解决这些问题的过程中,我们会借力于这些服务来快速的往前跑。

因为客户需求或者说团队结构的变化,我们需要快速解决一些问题。

此处输入图片的描述

这是我们在2.0上做的一个调整,比1.0会稍微复杂一点点。右边是和微信、社会平台对接的一套系统。前面有公网的SLB,后面有API集群,这些集群会把数据直接打到分布式队列里面,会有不同的后台处理不同的事情。我们把串性做的事情全部并行化,该做统计分析的做统计分析,该做索引的做一些索引的服务,包括针对一些高并发的、读写要求比较高的地方做缓存的更新。底层会用到像SLS做日志相关的统计分析,当然也会用云上的一些性能测试工具,有一个新的服务上线或者说当我有一些活动的时候会通过云上的性能压测压一下整个系统的能力。网页端我们就做了一个模块化的调整,有微商城、积分商城、票务、服务预约所有的东西都是通过模块的方式有不同的团队专门维护,但是他们之间通过我们定义好的协议或者框架做支持,让他们可以并行的去迭代。

其实我们用了很多很多云上的东西,昨天和阿里的讲师聊的时候我说,其实在两年前只要阿里云出一个新的服务我都会马上看一遍,然后拿到第一批的要求,然后把整个服务做一下评估,知道以后我做什么业务场景的时候这个服务可能会帮到我。但是今天几乎已经做不了这件事情了,因为你们的服务太多了,你的服务的发展已经超过了我可以评估的阶段。

我们在2.0的时候,也是沿用这样的思路。可能有些东西我们没有找到最好的方案,但是当有些问题出现的时候我们会第一时间去看,你上面有哪些东西,这些场景是什么样的,能不能解决我的问题。我们几乎就是站在了一个巨人的肩膀上,他们可以把所有的高并发高响应都做好,我只要用就可以了。

我也经常和我们的团队讲,在做一个创业的小产品的时候你还需要架构师吗?因为云上的服务已经很好了,你真的不需要了。你只要看看做一下集成,你的产品就出来了。但是有可能在有一天你会需要一个云架构师,他和你说如何优化你的内核或者如何优化你的外部服务器,或者说当你提某一个产品需求的时候他会告诉你,其实在这个世界上有哪些服务你可以快速的去用,你只要五个人开发两周时间就可以做出来。

简单分享一下我们在2.0过程中遇到的问题。

  1. 和微信整合过程遇到的一些问题。

    所有调用第三方API都会有一些API的rate limit。不管你在做产品定义或者产品实施或者你在研发的时候都不会注意这些事情,但是有一天发现用户走到一半卡住了,为什么?因为有些API的限制非常高,有些API一天只能调一百次,但是并没有从产品上杜绝这个问题,造成我们架构调整的时候代价很大。

    另外会有一些白名单的限制,我们一开始觉得微信可以加20个白名单已经挺多了,但是这次里约奥运会,某一个客户上面已经超过了20台,所以我们做了一个调整,所有第三方调进来的可以水平扩容,但是所有调出去的地方都是通过专门的服务器调用微信的服务,保证调出去的IP不会受到限制。

    我们也突破过微信每天群发一条的限制。有一天有一个客户群发了16条,我们和微信的团队一起来调这个问题。最后发现是他们有一个小bug,加上我们一个绕过这个bug的问题,触发了他们无限量的消息群发。当时这个客户发完之后,很多客户都问说,你们是不是和微信有专门的合作,所以你们可以绕过微信的限制发这么多,然后我们每次只能呵呵一笑。

    另外我们做微信自动化测试很麻烦,所有一条消息通道都是从微信的客户端到微信的服务端,最后再调到我们的服务上面。当我们的量越来越多,功能越来越多的时候缺乏一些测试。所以现在我们也在构建一些基于微信自动化测试的东西,这是比较麻烦但又不得不做的事情。

  2. 我们在帮一些客户做运营时也遇到过一些薅羊毛,说起来都是血和泪的教训。所以我们也利用一些服务做薅羊毛的防范,通过整个数据的Logs到SLS,再到ODPS,到我的业务数据库做统计分析限流。像现在联合利华已经决定直接使用这些数据风控的服务,来解决潜在的安全或者被薅羊毛的风险。

    我觉得主要就是重视,像我们在座的各位可能完全没有这方面的意识,大家觉得一个手机号收一个验证码,后来发现其实中国有很多的薅羊毛党,他的手机号是虚假的,但是可以收短信,只要收到短信就可以给他积分,可以完成整个活动,全部都可以自动化。

  3. 我们用了很多的云服务,我们也踩过云上很多的坑。但是整个团队,包括我们的团队和阿里云的团队或者说和我们用的服务商的团队,大家可以一起把问题很快解决掉。第一个就是有一天我们发现我们整个Redis一直在报警,当然在云上面DNS出了问题把内网解析到外网,所有调用第三方服务的时候都有超时,没有设超时的话平时毫秒级的延时,真正量上来以后可能就是几秒到十几秒,这是连锁的反应,整个服务全部就会宕掉。另外两个月之前我们从自建的MongoDB直接切到云的MongoDB,在切之前我咨询过一些云服务商,我问主节点和副节点的延迟多少,他说毫秒级,我说我需要关心吗,他说不需要关心,写进去马上读没问题的。从我们自己的感觉来说,这好像是不可能的事情,但是如果说我们就先试一试,我们就在某一次活动里面上了,但是当量上来的时候我们发现这个延迟有时候可能到1分钟到2分钟,最后没办法我们就切回来,简单粗暴的方式扛过了那次活动,很多时候还是要做折中的考虑。

每次在云上出问题时我们有些客户会说,云这么不稳定还要用云吗?就像我们给你们提供一些服务一样,因为你付钱,所以你觉得只要付钱一定是100%的。但是,如果不用云你自己自建会有问题吗?我觉得一定会的。以前我们自建的时候也会遇到很多问题,可能一年里面比你用云服务遇到的问题更多,因为你是自建的,所以当你出问题的时候你就会觉得这个苦水只能自己咽下去。但是用了云服务,哪怕出了一点点问题,在一年里面服务他非常非常好的,但是哪怕出一次也会很生气,然后也会偷骂你一顿。所以可能还是看你有一种什么心态吧,对于我们来说因为被骂多了,我们会保留一种心态,我们觉得你会越来越好,因为我们觉得我们提供的服务也越来越好,所以我们还是继续用,可能会遇到一些问题,但是你自己做你也会遇到各种各样的问题。

我们整个从1.0到2.0或者说到感触比较深的地方,对于我们小的团队,遇到一些问题可能会有一些短平快的粗暴方案去解决。比如我们有一些搜索的需求,当搜索变慢的时候加索引,当需求变更的时候改索引,它是可以满足我们一个当前的业务场景。我们也遇到过一些统计数据丢失,突然有一天一些客户说昨天我的用户互动的统计数据没有了,但是我们发现我们自己的一些服务上面都是好的,只有个别客户丢失了,怎么办?出现第一次的时候我们会专门再跑一遍,告诉客户说数据有了。第二次我们觉得不好意思,所以我们会说,当出问题的时候我比客户先知道,所以在我们统计的地方加了一个短信的提醒,如果早上七点我收到一个短信说哪个客户,哪个微信的服务号统计数据失败了,我们会在客户发现之前第一时间解决掉。但是这种折中的方式累计多了之后你还会欠很多债。比如说搜索推荐总有一天你没办法再加索引了,像我们有些粉丝的表放某一个客户可能一开始几百万进来,后来越来越大,他希望根据客户的交互时间,根据互动的时间各种条件进行搜索,就没法满足,所以我们会切到OpenSearch专门构建一个平台做搜索。客户越来越多,你会发现每天你都会收到一个报警,只是是不同的客户,只能停下来解决这些问题,必须要花精力彻底的解决掉,而不是一直在救火。

代码和冗余越来越严重,对于优惠券的模块或者商场模块,客户说希望这个界面颜色可以和我的logo颜色像一点,另外一个客户说我希望在下单的时候可以多加一点。所以我们通过整个后台控制哪些客户可以看到哪些模块,会有一些代码冗余,当这种东西越来越多,你会发现你在修这些问题的时候就会变得越来越头大。

然后我们有一些自动化的监控,发展到后面代码量越来越多,模块越来越多,每次部署时间很久,所以我们也需要急剧的解决自动化优化的问题。还有数据隔离和丢失,我们在分库分表上做的还不够灵活,会有一些问题,也需要我们快速的去解决,因为它已经阻碍了我们的脚步。生产环境问题的跟踪越来越困难,虽然有错误日志的平台可以方便的看到错误,但是监控数据分散在各个地方,有的在云监控上面,有些是在消息队列服务上面,为了解决这个问题你会四处对一些报表,这些是到现在为止我们希望能快速解决的问题。目前我们也在尝试APM的服务,报警的时候当然希望知道哪一行代码在哪一行出了什么样的问题,到底是慢还是抛了异常。现在也在和像听云做一些前期的对接,看我们怎么样利用他们的方案解决我们这方面的问题。

所以3.0我们不会做大的调整,但是会做一些变化。比如模块里面的耦合太严重,我们可能会开始做一些微服务让模块和模块之间都是独立的,他们之间通过RPC或者系统的调用解决之前的耦合。

最终其实我们希望有一天也能提供一些云的服务来反哺整个云的生态,在底层就是整个云的基建设施,中间有很多SaaS服务,在我们的服务站有很多开发者,可以方便的来利用各种各样的云、SaaS服务快速迭代自己的产品。这是我今天主要和大家分享的。

Q&A

Q1:咱们目前用的阿里云,在PaaS层有没有实践?比如容器。

房玉峰:这其实是我们3.0做的事情,我们在看阿里云整个容器的服务,因为我刚刚讲到像我们模块和模块之间代码还是耦合在一起的,其实在代码层面做了直接的交互。我们希望把模块和模块之间通过微服务的方式嵌起来,所以我们在调研阿里云整个容器的服务,看看我们是不是能把这些东西用起来,但现在我们还没有用任何容器相关的东西。

Q2:刚才提到切到MongoDB发现延时有两分钟,是通过什么方式发现的?切回来时会有数据,这个过程中怎么处理的?

房玉峰:关于我们怎么发现的?我们的监控发现我们有些服务一会儿好,一会儿出现一点问题。这次发现出了点问题,等你上去看的时候发现又好了,所以我们就找了阿里云的团队,因为我们是阿里云的大客户,所以阿里云MongoDB的团队和我们一起解决这个问题,最后是阿里云告诉我们说有一次两分钟的延时,20分钟之后又有1分钟的延时,不知道哪里出了问题,我们也很抓狂,因为我们在做奥运会的活动打开发现是好的。最后依靠阿里云给我们的支持,告诉我们是这样的问题。再切回来时,因为这个数据量太大了,需要很长的时间,所以只是临时的把我们整个硬件的page升上去。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注