韩伟,腾讯科技互娱研发部架构师,曾在网易任职8年,担任无线事业部产品总监。多年来一直从事技术开发,擅长开发高性能系统,对于软件架构设计也有丰富的经验。个人的技术兴趣在设计模式、软件体系架构等提高软件开发效率方面的知识。个人公众号:韩大(handa1740168)。
一、起因
PaaS作为“云”的概念,已经流行了很久。从使用的角度上看,似乎就是:写一个PHP,然后可以直接传到服务器上,用户就能通过某个URL访问你写的PHP了。——这确实极大地节省了开发和运维的工作量,因为这几乎完全不用去部署安装任何服务器端的软件,甚至数据库也给你装好了。
但是因为各种各样的原因,在国内PaaS的使用并不非常广泛,有可能是因为没有好的服务提供商(由于伟大墙的原因导致某些服务无法访问)。另外,作为一个游戏服务器端的开发者,也在试图从PaaS的概念中,学习如何提高游戏开发、运营效率的方法。所以就有了以下的研究。
本文主要的研究对象是Google出品的App Engine,以及Amazone的AWS两个产品。实际上微软、IBM也有类似的PaaS(Azure),由于时间精力原因只是粗粗浏览,并未深入。另外国内如阿里云也有一些近似PaaS的服务,但由于名气不大,也不在这里描述了。
作为一个PaaS,我们可以注意到,主要会分成几个层面来看,能比较准确地把握其特性。否则纷繁的技术名词,各种支持方案,会让人眼花缭乱。这几个层面就是:
应用场景:一款PaaS希望解决的重点问题。
开发支持:PaaS是一种允许用户的代码运行的服务,那么可以运行怎样的代码,怎样方便用户上传自己的代码(或程序),如何管理这些代码,是一个重要的问题。
运维管理:PaaS最让人感到方便的,就是几乎都号称“无需用户干预”的自动化运维,不需要用户自己去部署服务器、配置软件等,但这种能力到底是怎样,也是一个非常重要的部分。
关联配套:一个在PaaS上运行的程序,是完成不了太多的任务的,起码需要有一个数据库之类的存储软件。实际上的商业应用中,除了数据库以外,还可能需要大量其他的配套程序,才能让你的业务逻辑程序运行完整,比如Memcache,甚至Crontab这样的程序。由于PaaS号称“帮你运维”一切,所以很多都直接把这些服务也安装部署好给你用,你只要用服务商提供的接入参数,直接使用即可。那么服务商提供怎样的配套服务,有什么能力,是PaaS服务里面一个至关重要的特性,也是各种服务商“争奇斗艳”的主战场。
GAE(Google App Engine)
Google自己的Web服务,是具备一整套“基础设施”的,包括Web应用(如PHP)的运行框架、BigTable、GFS等广为人知的服务器端软件。所以Google App Engine的设计目标,就是让用户可以很方便地使用这一整套“基础设施”。
从某种意义上来说,为了使用Google的配套服务,可能会比托管运行自己的Web应用程序更吸引人。Google的基础设施,一般都是以“分布式”为卖点,提供超大承载量,和高度可用性。如果要自己去重建这一整套体系,对于一般的公司来说都几乎是不可能的。但实际上真正需要用到这么大的承载量,也很可能不是“一般的公司”。不过慕名而来的使用者,在Google的保证下获得信心上的安慰,也是一种重要的价值。
Google不愧是以技术著称的公司,其运行容器,支持Python/Java/PHP/Go等几乎所有主流的编程语言,及这些编程语言在Web应用程序方面的标准框架,如Servlet for Java。看到这里,不禁叹息于,游戏领域并没有什么“应用框架标准”——所以游戏服务器程序的模型真是五花八门无奇不有,这也让游戏服务的提供变得异常繁复困难。
GAE提供的开发工具,可以帮助开发者很方便地测试和部署代码到PaaS上。这些开发工具包括一套结合Eclipse的IDE插件,以及一组命令上传部署工具。用户可以使用这些工具,好像开发测试本地程序一样来使用。当然使用之前还是需要配置自己在GAE上的帐号之类的参数。
GAE另外一个很有特色(也许是缺点)的地方,就是开发者只能在“沙箱”里运行自己的程序,因此你不能用到代码去操作socket、本地文件、线程等“原生资源”。因为有这样的约束,所以开发者上传的APP可以被认为是“无损”的自动部署到不同的硬件、网络环境上。同时,GAE也提供了大量的配套服务,用来补偿沙箱环境带来的功能缺失。
GAE的运维管理从代码部署开始就是全套的。首先是支持从Maven这类代码管理库拉取程序部署,其次是可以部署到Google提供的全球机房,期间提供自动扩容和负载均衡。其中比较值得注意的是,它的运维环境还支持负载灰度和资源配额,也就是可以设置各种参数,来限制缓存空间、实例数、最大线程数、存储空间、使用带宽等。这些配额并不是简单地基于IaaS的功能继承而来,而是可以针对应用容器,或者各种配套服务为目标来设置。
GAE另外一个很棒的功能是所谓GoogleAnalytics功能。几乎所有云服务商都会带统计功能,但Google Anlytics因为是针对GAE这种全托管沙箱服务做统计分析的,所以可以获得很多具体的服务统计的细节指标,而不仅仅是操作系统层次的CPU、内存、带宽这种大路货。我们自己部署任何一个服务,对于特定的服务进程,也会想要详尽的统计分析数据,用以监控问题,如果是用GAE,这些服务都是Google提供的,当然统计也是它的应尽职责。
作为一个Web App的容器,GAE在运维配置工具上,提供了全套Web界面的操作软件——Google Cloud Platform Console,可以配置诸如URL、静态资源、MIME类型、根目录、SSL等几乎所有WebServer的配置内容。用了多年的Web Server配置文件终于可以束之高阁了。
当然,其它的管理服务也都提供了WEB的配置管理工具。如果你不想手工去配置这些,也可以使用GAE提供的Restful接口,去用代码操作这些服务配置,这样你可以自己写一个喜欢的管理软件,或者是写个自动化的工具去做这类的配置工作。
GAE提供的配套服务,都是那些大名鼎鼎的Google系基础服务,分为两大类型,数十种细类:
1、存储服务
App Engine Datastore:NoSQL对象存储服务
Google Cloud SQL:在GAE上的MySQL,由于是关系数据库,所以不能自动扩容
Google Cloud Storage:以Restful接口使用的分布式文件系统
2、辅助服务
定时任务:类似crontab这种
Memcache:最常见的Web后端缓存服务
Blobstore:一种“数据块”存储服务
Oauth API:身份鉴权认证服务
各种Messaging服务,包括电子邮件、短信、语音等……
全文搜索服务
图形处理的API库
各种常用的服务器端编程库
从上面来看,最值得关注就是存储类服务,毕竟Google是处理大数据的互联网鼻祖。由于一般的商业互联网服务,都很依赖一个容量大、方便扩容的数据存储层,所以Google这套东西是非常有价值的。可惜作为游戏领域,数据大倒是大,就是其数据关系一般比较简单,就是玩家的存档数据而已,所以游戏开发商如果用这些BigTable、GFS为基础的服务,从延迟性和成本上看,好像都不是特别有必要。
另外从辅助服务来看,细节到连crontab都提供,更不用说各种服务器开发库,只有你想不到,没有他没准备到的。这对于开发者来说是一个很方便的地方,因为一来不需要到处找各种开源库,二来也无需费口舌去和同事统一各种开发库,只需要用GAE的就好了。
AWS
按理说,AWS应该不算PaaS,而应该算IaaS。那为什么会放在这里说,其实主要有两个原因:
一是AWS并不是简单的IaaS,因为它提供了大量的配套管理服务,虽然这些服务大多数都是通过Restful API的形式提供,但确实是可以编程来调用的;
二是AWS本身也一个很有特色的“可编程”服务:Lambda服务。这个服务是可以嵌入在它提供的各种服务中,提供用户自定义控制这些配套服务的能力,所以让这些服务看起来更像平台PaaS,而脱离单纯的IaaS。从嵌入Lambda的角度来看,AWS比GAE更加激进,而不是遵循传统的Web服务存在,因此能被更广泛的互联网业务所使用,而不仅仅是互联网电商客户。据说最近一些在Steam上很火的新游戏,都有用到AWS的服务,包括Lambda。
AWS因为核心是围绕其IaaS服务器EC2来设计的,所以并没有所谓的开发框架。而更多是针对EC2提供的各种透明的、基于网络的优化功能。比如AutoScaling,就是基于使用时间、负载情况,对EC2实例进行伸缩,这里补充一点,EC2的虚拟机也是支持Docker技术的,所以能比较方便地启动、迁移。而另外一个叫ELB的服务,则是比较传统的类似L5的负载均衡器。
能够真正对AWS“编程”的,就是他们的Lambda服务。你可以多种语言来编程,包括Node.js/Java/C#/Python,来编写一些触发器产生的事件处理回调。在AWS的各种服务中,有很多服务都支持Lambda,如S3/DynamoDB/Kinesis,这些服务在收到请求,或者发生状态变化时,都会触发很多不同种类的事件,从而调用用户自定义的这些代码。
比如对象存储S3收到数据的时候,就会触发代码。这个功能就能很方便的用来做游戏的存档和读档。又或者数据库服务DynamoDB在对数据进行Put或者Get操作的时候,也可以触发你的代码。当然,像Kinesis这种流式计算服务,本身就是需要用户代码来做离线的统计或数据处理的。
把用户代码嵌入到服务当中,而不是提供一个用户代码的服务容器,这个设计也许是需要服务IaaS而产生的。但这种灵活的设计,也把使用者从“标准开发框架”中解放出来,作为服务提供者,也无需像Google那样提供各种语言和五花八门的WEB编程框架。由于游戏服务器端一般的通信模型和Web相去很远,有大量的主动通知,以及在线数据反馈的需求,所以使用Web那套框架肯定是不能满足需求的,但好像AWS这种,游戏客户就可以自己写一个简单功能的GameServer,比如只做简单的广播服务,而其它的存储功能,都以Lambda的方式把游戏逻辑和存储服务结合起来,比较省事。
AWS由于主要目标是卖EC2虚拟机,所以拥有很多更“通用”的运维管理工具。其中一个就是Benstalk,这是一个一个Web应用部署工具,通过集成Git来拉取和存储你的软件。对于仅仅是需要部署WEB应用的客户来说,非常方便。而另外一个工具叫OpsWorks,这个是更通用的运维部署工具,看起来非常像Chef,你可以用它来部署任何软件。
这类工具都是通过先在你的虚拟机(部署目标机器)上,安装一个Agent(代理程序),然后这个代理程序就可以从一个集中的软件部署任务服务器上,接受各种部署或配置的任务。用户可以集中在一个界面上去部署软件,修改配置,而且可以通过JSON格式的数据表,记录各服务器相同或者不同的配置,通过工具或自定义的脚本,自动化的在目标机器上做任何的部署操作。
AWS把对于EC2虚拟机的弹性部署,按负载自动伸缩能力,也应用在计费上。所以有一个叫CloudTrial的服务,其实就是按需付费的功能。这对于各种还在推广开发期的业务特别友好,国外有很多独立游戏或者创业项目,都直接在AWS上开发测试。同时AWS也提供了所谓的CodePipeline工具,其实是一种持续集成工具,但部署部分就默认结合在AWS上。
虽然GAE也有各种开发工具,但直接以持续集成(CI)的面貌来提供服务,并且结合云服务,还是非常值得点赞的。毕竟现在在持续集成方面,大家都还是比较繁琐地去设置各种服务器环境,结合上运维系统,才能真正的“自动化集成”。而使用CodePipeline,开发者可以直接一键就把代码部署到EC2虚拟机上,中间还经过自动化测试等等集成任务。这样就又省了折腾持续集成软件的工夫了。
最后说说CloudWatch服务,这和GAE的Analytics服务有一种重要不同,就是它主要面向的虚拟机的数据,而不是具体的服务。这个系统另外一个特色,就是可以从日志生成、搜集、监控、告警、报表一体化。可以说是一个通用的日志分析系统。用户可以向CloudWatch发送自定义的指标,然后设置监控阈值,这样CloudWatch不但会在你设置的范围内进行监控报警,而且还会存储所有的这些日志,并用以生成统计报表和图形。
所有的这些服务给我的感觉,就是虽说AWS服务看起来没有GAE那么“有技术含量”,但由于其高度注重易用性,所以非常容易吸引人去使用。就是不管你是什么平台或者架构,似乎都能用的上它的某几个服务。而且所有的这些服务界面,都是统一接口模型、统一界面风格,让人可以触类旁通,学习起来一点不费劲。(当然这里也有可能因为本身没有提供太过复杂的功能)
由于AWS的主力产品是IaaS的EC2虚拟机,所以其在线计算的云服务几乎是没有的。但是有丰富的其它配套服务,一点不比GAE逊色。它们大体来看分为两类:
1、存储产品
S3:对象存储服务,以二进制块的方式直接存放。一些游戏开发商直接用来存用户存档数据。
EFS:和古老的NFS标准兼容的分布式文件系统。
CloudFront:具备全球节点的CDN服务。CDN国内用户是比较熟悉的,但AWS的优势在于其全球的机房和带宽优势。
RDS:这一块就是“关系型数据库”的服务类,包括了MySQL Orcale SQL Server PostgreSQL Aurora这些数据库服务器。这个服务就非常典型的是PaaS平台同的类型,但是AWS同样也提供。而且最后这个Aurora数据库,是AWS自己研发的,兼容MySQL的产品,据他自己说比MySQL快很多。
DynamoDB:一种NoSQL数据库,属于Schemeless,也就是无需预建数据结构的。可以使用Hash搜索(大概是等于号匹配),也可以使用Range搜索(大概是大于和小于号匹配),这一点是很多NoSQL都不具备的。
ElastiCache:类似Memcached/Redis这样的缓存服务器集群。这里AWS直接提供集群功能,就不需要自己去想办法搭Redis集群了。这也是比较典型的PaaS服务商会提供的服务。
SQS:分布式消息队列服务。这个服务很特别,一般来说消息队列服务,是用于比较大规模的服务器系统,需要把计算任务分布放在多个硬件(虚拟机)上运行,而彼此之间又需要互相通讯,所以需要这种消息队列服务。如开源的有ActiveMQ或ZeroMQ这种,但直接做成分布式的,还是比较少见的。这样不用自己维护消息队列服务集群,只需要使劲买EC2来添加计算节点,还是比较爽的。问题是这个服务的接口是Restful的,也就是说基于HTTP协议的,所以其延迟性应该是一个问题。如果在游戏里面使用,估计只有一些不太在乎延迟的,触发量较少的操作,会适合用这个服务,比如用户从游戏大厅进入到游戏房间这种。
2、离线计算产品
EMR:用来分析所有AWS提供的服务的日志。是一个强大的日志统计分析系统。
Kinesis:一种流式计算,类似Storm/Spark Streaming这种系统。值得注意的是,它同样是可以直接调用所有的AWS服务生成的日志。这是AWS离线计算产品的一个通用特征,就是“本系统”类的服务,都可以直接调用,无需用户自己去做各种接口或格式的转换。
Machine Learning:著名的机器学习服务,同样可以从AWS全线服务的日志中作为学习、测试数据集。秉承AWS的易用性设计目标,这个服务内置了大量的学习模型,很多功能都不需要使用者去自己编写各种学习公式。而只是需要开发者使用其交互式视觉工具,就可以完成对机器学习任务的配置和运行。Redshift:PB级别的数据仓库,属于列式存储系统(一般大容量的数据库都是这种)
总结
PaaS作为一个“云”时代非常重要的概念,在实际的业务中应用却远没有IaaS和SaaS的广泛。究其原因,我觉得无非是其灵活性受限导致的。比如GAE这种教科书式的PaaS平台,尽管提供了各种管理服务和多种语言框架,但最后还是受一个大的Web服务的框框所约束。而且后台关联服务和PaaS服务存于一个沙箱中,虽然提供了很好的自动化运维的能力,但也造成了很多不便。除了一些很简单的、典型的互联网业务,很多其它的服务,都多多少少可能需要突破这些限制。不过话说回来,这种PaaS对于标准的Web服务,确实是非常的方便,几乎完全不需要自己去运维。
而以AWS为代表的,这种不太纯正的PaaS,提供了大量的运维工具,实际上还是需要用户自己去做很多运维的工作。但这样也提供了极大的灵活性:你可以用IaaS的模式去使用AWS。同时AWS也提供了很多PaaS的配套管理服务,使用者同样可以不去自己部署、配置这些服务。可以说AWS同时IaaS的灵活性,和PaaS的强大功能。不过AWS也不是天衣无缝,其中Lambda服务,就不属于通用的业界标准,如果你把很多业务代码用Lambda的方式来实现,那么你就无法切换到别的云服务商上去了。加上AWS服务大部分都是Restful API,所以网络造成的延迟和带宽占用,都不适合大量交互的在线服务——网络游戏。
展望
最后展望一下PaaS的发展,个人觉得通用型PaaS应该是没前途的。因为业务模型千差万别,模型上的通用必然带来功能上的限制,以及易用性上的确实。所以PaaS还是应该按不同的业务领域具体细分下去。现在互联网业务比较大的业务领域有三类:一是电子商务类,二是游戏类,三是资源社区类(如B站、今日头条、各种FM、云音乐APP等)。这三类业务都有其非常明显的模式和需求差异。
比如电商类服务,一般所谓的“业务流”是一个重要需求,而且对于存储安全性非常重视,但对于延迟要求就很低;而游戏类则无法接受单向的HTTP协议,而且多数都要和游戏客户端引擎(Unity/Unreal什么的)结合,对于延迟的要求非常高,大多数不能忍受超过300ms,存储只要可以无限扩容,安全性无需达到金融级都可以;社区类则对于大量的文件存储很分发是硬需求,需要更广的部署地点,但业务逻辑一般不会过于复杂。
因此我们很难通过简单原始的一个Web App应用框架,就把这三个方面的业务需求都框进去,而且除了处理HTTP请求,还有大量的业务通用功能,是可以作为服务做出来卖钱的,比如电商的订单系统、游戏的同步服务、社区的基础社区功能等。
最后的总结,就是PaaS服务必须要立足业务领域,面向业务中的通用逻辑,才能真正的做好一个PaaS云。
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721