Serverless架构实践初探

随着云计算技术的进步,软件系统的架构方式也因此发生着一些变化,其中Serverless架构就是这里的一个典型的例子。

(图片来自:http://t.cn/RadEFqr)

什么是Serverless架构

目前关于Serverless架构的准确定义,业界并没有一个统一的标准。那么我们从字面上来分析,所谓Serverless架构,翻译过来也就是无服务器架构。那么似乎可以涵盖以下两个方面:

  1. BaaS(Backend as a Service)即后台即服务。后台即服务出现有很长一段的时间了,例如Parse,Firebase都是典型的代表。具体来说就是服务器端的逻辑和状态是完全依赖于云平台进行管理的。
  2. FaaS(Function as a Service)即函数即服务。函数即服务,意味着这些函数中的后台逻辑是由我们开发者自己实现的。但是这些函数是执行在一个无状态的计算容器中的,函数的执行是基于事件驱动的,关于这些函数的部署、执行、触发是由云平台来管理的。其最典型的例子就是AWS Lambda。

我们这篇文章中的所讨论的Serverless,是指的第二种,也就是FaaS。在我们Thoughtworks最新一期的技术雷达中,Serverless架构位于试验象限,下文就介绍下我们在Serverless架构下的一些实践经验。

数据处理业务的Serverless架构演进

所谓的数据处理业务,是指我们的系统需要每天定时获取一些外部数据与我们自身的数据结合,生成一些数据报表。那么最初我们是怎么设计技术方案的呢?

传统架构方式

我们将业务拆分为3个独立的服务,2个Data Collector,1个Data Loader,都分别部署在AWS服务器上,将中间数据存储在一个外部S3(AWS的数据存储)上。最后将数据保存在数据库中,在数据库之上使用专门的BI工具来制作报表。我们第一个数据服务就是按照这样的架构进行设计和实践的。当系统上线服务以后,我们发现了里边的一些问题。

在这套系统中,Data Collector 2每天的执行时间较长,需要1个小时左右的时间,而Data Collector 1每天的执行时间较短,通常执行时间不会超过1分钟,但是由于外部数据源的更新时间是不确定的,所以虽然我们服务实际有效时间只有仅仅一到两分钟,但是也不得不让服务器全天运行。

可以看到,这个系统每天的有效时间只有一个小时,其他23个小时实际上是在浪费资源,如何改善这样的情况呢?首先想到了让服务定点运行的方法。由于我们外服数据源的更新特点,虽然它的更新时间是不确定的,但是它在某个特定的时间点前是一定会更新的。基于这样的前提,我们将服务运行时间改为定点运行,这样是不是就能解决问题了呢?

然而现实并不总是那么美好,因为我们服务间是有依赖关系的,Data Loader是依赖于我们Data Collector的处理结果的,当我们把运行方式改为定点运行后,带来的问题是,一旦Data Collector的运行状态出现了问题,例如运行时间过长,运行中出现错误,那么Data Loader必然出错。同时改为定点运行后,我们的数据更新必然有延迟。

那么如何解决这些问题呢?

Serverless的系统架构

我们引入了Lambda,将Data Collector 和 Data Loader用Lambda进行了替换,带来了下面这些好处:

由于Lambda是由事件驱动的,S3上一个数据的变化可以触发一个事件,SNS的一条消息可以触发一个时间等等,在使用Lambda后,我们就可以讲原来基于时间的数据处理流程,转变为基于事件的数据处理流程,这样一方面可以保证我们数据更新的实时性,另一方面可以大大节省资源,由于Lambda是按照触发次数收费的,所以在我们的这个用例下,可以大大减少花费。

可能细心的读者想问为什么我们Data Collector 2没有使用Lambda进行替换呢?这是因为它的业务逻辑比较复杂,每次运行的时间较长,而Lambda的最长执行时间是5分钟,所以在这种情况下,就不适合使用Lambda进行替换了。

实时数据处理下的Serverless架构

在初识Serverless架构的好处之后,我们开始在其他方面的应用尝试,比较典型的一个例子就是在实时数据处理业务下的Serverless架构。在我们业务下,我们需要实时跟踪一个外部的数据源API,根据它的数据变化来实时更新我们的数据。

在我们的架构设计中,我们使用一个Lambda来跟踪外部数据源的数据变化,并将其推到AWS Kinesis Stream里,AWS Kinesis会触发第二个Lambda进行相应的数据处理,并把数据存储到数据库中,值得注意的是由于Lambda是可以根据需求自动伸缩的,所以Lambda会根据Kinesis的需求来自动扩展。这就体现了Serverless架构下的另一个好处,可以相对简单的,自动进行伸缩扩展。

Web系统的Serverless架构

对于Web系统这种我们最为熟悉和常见的IT系统来说,它能不能用Serverless的架构来实现呢?我们来看下边的例子。我们先来看看传统的例子。

在传统实现中,我们会利用Load Blancer来做负载均衡,然后后续的应用会部署在AutoScaling Group中,根据流量来做自动伸缩,这种模式已经是十分成熟了。那么在Serverless的架构下该如何设计呢?

在Serverless架构下,一般我们的前端应用的资源文件包括Html,JS,CSS,都是部署在S3(AWS的文件存储)上的。前端应用通过AJAX请求向后台请求数据。后台通过API GateWay定义对外的Endpoint,同时每个Endpoint会触发一个Lambda进行数据操作,例如图中的GET,和POST请求会触发两个不同Lambda。这样的Serverless架构可以让开发者不必担心水平扩展的问题。

Serverless架构的未来

目前AWS Lambda似乎已经成为了Serverless的代名词,为了帮助开发者更好的构建Serverless应用,市场上出现了一些工具和框架,例如Serverless Framework。但是同样我们还可以看到一些其他的云平台和开源框架也在提供类似的服务,例如webtaskOpenWhisk,以及其在IBM Bluemix上的实现。

Serverless架构作为一种新的架构方式,还在不断的发展中。希望本文能给您带来一些思考。


更多精彩洞见,请关注微信公众号:思特沃克

Share

我们在ThoughtWorks打造一款P3产品

从2016年3月份加入ThoughtWorks以来,已经过去了十个月的时间。从最初的激动,到逐渐的适应,这其中有一些感悟想要与大家分享。

初识P3

在新人入职培训中,公司的HR介绍了ThoughtWorks的三个支柱。也就是:

  1. 可持续化的业务
  2. 追求软件和技术卓越
  3. 提倡社会和经济公正

ThoughtWorks所做的每一件事、每一个决定都是从这个三个支柱出发的。

1-tw-3pillars

当然每个公司都有自己的使命和主张。例如Google想要“整合世界的信息”,让其更有效的被人类利用。Facebook则致力于“让人们可以更加有效的分享和联结”。每个公司无论大小,无论是否被总结成文字,都有自己的使命,只不过有大小之分罢了。

ThoughtWorks的前两个支柱都很好理解,我们追求可持续化的业务,我们追求软件技术的卓越。例如我们定期会发布技术雷达,为行业提供技术选型的指导。我们为客户提供敏捷软件工程方法,提高客户的软件工程质量。但是ThoughtWorks将“提倡社会和经济公正”作为自己的使命之一,而且写出来说出去,在之前我并不是十分的理解。追求社会和经济公正,在一个国家来说,不应该是政府应该做的事情吗?如果提到“人类”的高度上来说,那不应该是联合国应该做的事情吗?会不会是仅仅说说而已?

很多大公司也做慈善,比如说会捐献一些善款,组织一些公益活动。当然这些都是很好的回馈社会的方法。但ThoughtWorks的做法的确不同,公司更多的是利用自己的技术,来推动和影响社会和经济公正。ThoughtWorks与很多NGO组织合作,利用技术的手段来帮助他们提高IT能力,让他们能更高效的完成工作。ThoughtWorks组建的思沃学院,为在校的学生提供更多技术指导和培训,帮助学生成长。当看到这些以后,我慢慢的觉得,公司的P3好像并不是仅仅的说说而已,而是尽自己的能力,来改变一些事情。实话实说,这种冲击对我来说还是挺大的,但更大的冲击,是来自于我看到了“心声”这个APP。

缘起

“心声”是ThoughtWorks西安办公室的开发人员,利用自己的业余时间,做出的一款帮助聋哑人与正常人交流的APP,可以让正常人的语音转换为文字,帮助与聋哑人交流。这是我之前根本不会想到的事情,当我看到身边的同事,话费着自己的业余时间,利用自己的技术,在实实在在帮助聋哑人的时候,感受到P3文化已经融到了TWer的DNA里。在这家公司做这样的事情,是一种自然而然的事情。那么我又能做点什么呢?

直到有一天看到一篇报道文学,讲述是中国人口老龄化,农村和城镇的空心化,产生了大量的留守老人。有一些老人长期无人照顾,在突发疾病时容易酿成人间悲剧。具体的我就不详细描述了,因为是实在是太过悲惨。感慨万千一番,我想,自己能做些什么,哪怕能带来一丝丝的改变?

2-liushou

我改变不了中国城市化的进程,无法让大城市的年轻人能回乡照顾自己的亲人;

我改变不了国家的户籍政策,无法让这些留守老人在大城市与自己的子女团聚。

我也改变不了现在的养老行业,无法让留守老人都住进养老院里,使之得到基本的照顾。

但是我可以做的是,利用自己的技术,帮助他们在生命紧急的关头,发出求救的信号。

开始

产品梳理

基于这样的想法,我与身边的小伙伴一起商议得出了一个成型的方案,简单来说就是开发一个APP,搭建一个平台。在一个城市、一个社区,或者村庄里,招募志愿者。同时开发老人端的APP,和一些硬件设备,比如说手环、手表等等。当老人发生危险或者需求救助的时候,他可以按下这些设备上的救助按键。那么这个救助信息就会在平台上发布,附近的志愿者就能看到,从而在最短的时间内能提供救助,避免悲剧发生。当然这只是一个初始的想法。紧接着我们就做了一次User journey,梳理了对于我们最为关键的需求点。

3-ag-user-journey

理清楚需求后,按照优先级划分好任务,并建起了我们的项目看板,追踪项目的运行情况。

技术选型

产品需求梳理好了以后,下面的问题就是如何进行技术选型了。第一个问题就是由于我们都缺乏相关硬件知识,在考察了市面上现有的手环之后,并没有发现可疑提供SDK让我们直接利用的。又想到了Apple Watch,但是考虑到高昂的价格并不是一个最好的选择。于是乎,还是决定再做一个针对老人的手机APP。

4-aidsgo-elder-app

5-aidsgo-elder-app-2

同样因为我们的Mobile开发经验并不是特别的丰富,于是选择了React Native。并设计出了我们的系统构架图。

6-ag-tech-artch

由于迟迟没有找到一个合适硬件产品来触发求救信息,让我们始终觉得这还不是一个真正可用的产品。终于有天,公司广发英雄帖,召开技术大赛。并在邮件中介绍了一款AWS刚出的硬件设备——AWS IOT Button。这让我们都眼前一亮,这不就是我们要找的东西吗。简单来说IOT Button的按键可以trigger AWS上的一个lambda。有了这个,后边的事情就是我们的强项了,于是乎立马报名参赛,并购入了IOT Button。

产品实现

下面就进入到了具体开发的阶段,充分发挥每个人的特长。虽然大家都是开发,但是有人有UX的特长,有人有mobile的特长,大家各尽所能,发挥自己的特长,让这个产品越来越好,首先就是UI设计。

7-aidsgo-app

8-aidsgo-app-2

React-Native可以说是给传统的APP开发带来了新的方式,可以让传统的web开发人员快速实现产品。但同样也带了不少问题,例如API的变化,第三方组件的支持,好在我们的产品场景相对的简单,所以使用ReactNative还是一个比较好的选择。

同时救助者的实时位置同步也是一个比较大的挑战,我们可以在自己的后台的实现一套消息队列的服务,来做位置同步。但是最终我们使用了市面上成熟的实时数据同步服务,来快速实现产品。

目前产品已经进入了后期开发的阶段,小伙伴们在进行最后的优化,期待能在最后技术大赛的showcase里拿出一个能够成行的,可以真正帮助到老年人的产品出来。

为什么做这些

从初始想法的生成到如今产品的逐渐成型,我们花费了不少业务时间,有朋友问做这些事的意义是什么?其实我现在也说不好,在加入ThoughtWorks之前,遇见一些社会事件,可能最多就是捐点钱,在网上转发转发、评论评论。加入了ThoughtWorks后,看到了很多、也想了很多,自己也想真正做些东西出来让这个社会变得更加美好一些。

Share

ThoughtWorks点滴,一个新人的年终感悟

又到了年末,感觉时间过的真快,2016年就这么匆匆流过了。尽管时光飞逝,这一年的工作经历却比以往几年都要来的丰富,原因很简单,我换工作了。从2016年的三月份正式加入ThoughtWorks,到现在已经有9个月的时间,回想起来还是有所感悟。

初识ThoughtWorks

虽然今年才正式加入ThoughtWorks,但是早在很久之前就对这家公司有所耳闻。在西安,ThoughtWorks可以说是社区活动的引领者,每个技术领域的社区活动都有它的身影。比如前端圈的UI Super Day、测试圈的BQConf、运维圈的Devops MeetUp、BA圈的DnA Workshop、还有Code Retreat等等。在西安,只要是你对于技术感兴趣,应该都多多少少的参加过ThoughtWorks的活动。我也同样如此,在Code Retreat上见识到了ThoughtWorks同学对于代码的热情和信仰。觉得这是一家不同的公司,再加上不少好友已经加入其中, 现在看来我的加入也是一件自热而然的事情。

现在仍然深切的记得3月份入职时那满怀期待的心情。

入职的第一天,最大感受就是真是太快了。上午办完入职手续,下午就是进了项目组。以我之前的经验,入职第一天多是熟悉公司,应该没什么特别的事情。但是在ThoughtWorks,当我下午两点坐到工位上,组里的同事就开始给我讲项目情况了,这速度是我完全没有预料到的。

1-team-header

而接下来的几天,最大的感受就是快。同事打字的速度之快,快捷键之熟练,写代码之快,让我大开眼界。讨论问题,一旦问题清楚,马上解决。而同样的问题,在以前的公司必定要引发一场邮件大战,到真正解决怕也得好几天的时间。速度快是我加入初识ThoughtWorks的第一感触。

敏捷之旅

在度过了几天适应期后,就开始真正上手工作了,各种新鲜的感受也接踵而至,首先让我耳目一新的是团队的构成。

全功能团队

之前公司中的团队基本靠职能划分,一个团队负责一个职能。然后问题就来了,很多时候各个团队都是相互仇恨的,开发团队仇恨测试团队报的Bug多,测试团队嫌开发团队的质量差。出现一个Bug,开发团队里的前后台还得吵半天。这种情况在ThoughtWorks基本不存在,这里一个团队里有PM、BA、DEV、QA。所有的人员共同组成一个团队,大家的目标是统一的,为了让项目高效、高质量的交付出去。看不到相互的仇恨和推诿,更多的是相互的支撑和支持。这种体验让经历过传统团队的我,感觉倍加舒服。

那面看板墙

在以前的工作中,我一直好奇于老板掌握项目进度的方式。虽然我们也使用scrum的实践,虽然我们每天也站会,但是我作为一个团队成员,并不清楚现在项目整体是一个什么状态,我仅仅是完成每天分给我的一个个task。我隐约的觉得这并不是一个正常的状态。在加入ThoughtWorks看到那面看板墙后,我心中的困惑一下解开了。

2-kanban

我们一直使用看板来管理我们的项目,这能让所有的团队成员对项目的进度一目了然。所有人都很清楚每个story的情况,在站会的时候大家一起过一下板子,项目的运行情况以及当前遇到的问题就一清二楚了。现在我在做自己的side project的时候也会先建起一面看板墙。

结对编程

在ThoughtWorks,一般来说都是结对编程,对此不同人有不同的看法,我也并不想说结对编程到底好不好,仅谈谈我感受到的好处吧。

3-pairprogram

结对的第一个好处是能让新人快速了解上下文。我深知新人在拿到一个老的代码库时那种无从下嘴的感觉,通过结对,新人就能在老人的带领下快速进入上下文,而且因为是结对完成一个story,有特定、一致的目标,能够快速得到反馈,这样新人的学习速度会大幅度提高。

结对的第二点好处是能保证较高质量,结对的过程实际上就是一个相互review的过程,两个人通过进行思维上的交锋和讨论,能避免不少问题的出现,这样能够有效提升代码质量。

结对的第三点好处体现在结对的过程中,因为有大量时间的互相交流和讨论,你会感受到不同人的不同工作方式,这是一个很好的学习过程。另外结对的过程实际上这就是一个设计的过程,通过表述可以让设计的过程更加的完善,从而减少bug的产生。

结对好不好,1000个人有1000个看法,仅对我而言,这样的工作方式对我帮助很大。

团队之感

年轻的团队,战斗的团队,成长的团队

ThoughtWorks是家年轻的公司,大部分同事都是年轻人,这样的团队战斗力是很强悍的。依稀记得上半年的一个夜晚,项目突然发生了一个线上事故,大家立马投入战斗进行解决。虽然家里的网络各种不给力,还是及时解决了这个问题,那时已是凌晨4点左右。没有人有半点不满,这是我之前无法想象的。在之后的Retro中,大家一起分析了这个问题的根本原因,并制定了相应的action避免类似的问题再次发生。

4-night

在实践中学习,从问题中总结,在总结中成长。少有抱怨,更多的是怎么办,怎么改变,这样的团队提供促进人成长的良好环境。

Session文化

Session文化是我加入以来感受最深的一个方面,这同样也是公司文化的一部分。在Thoughtworks,你会看到人人都在讲Session,人人都在听Session。大家从自己的兴趣出发,对知识进行总结和分享,在公司中有讲,在团队中有讲,在社区内有讲。例如我们组每周都会有这样的Session分享,印象比较深的是,同组成员为我们做了一个React native的demo,为我打开了新世界的大门。

在这里你会感觉到人人都在学习,人人都在进步,你要是不学点什么,就会落后在别人后边,这也就是公司讲的同僚压力吧。

P3之行

将“追求社会公平公正”作为公司Mission的,我所听说过的也就Thoughtworks一家。P3的精神和文化可以说是刻在每个ThoughtWorker心中的,P3项目从关注非洲的儿童走失,到关注医疗公平公正,从关注渔业安全,到帮助慈善组织完善IT系统。为了这一Mission,公司付诸了实打实的行动。这在之前可能是我不曾想到,也不会做的事情。

5-capri-island-italy-jonathan-savoie

在加入Thoughtworks近一年的时间中,我所见识到的远不止以上这些。套用我们伟大领袖的一句话,“加入ThoughtWorks,广阔天地,大有可为。”


更多精彩洞见,请关注微信公众号:思特沃克

Share