云计算服务的工作原理
在讨论云计算服务架构之前,先介绍云计算服务的应用场景,然后介绍其开发语言及框架,之后再讲解云计算服务的工作原理。在了解了云计算服务的工作原理之后,我们才能更好地理解云计算服务架构需要关注的细节。
云计算服务的应用场景
云计算服务一般是运行时间较长或者需要持续运行的软件,如视频转码服务、爬虫服务和数据分析服务等。也就是说,云计算服务提供的是网站系统的云计算能力。云计算服务的应用场景众多,根据网站系统的服务对象和所在领域不同会有所不同。
那么,为什么云计算服务需要和后端应用程序分离呢?这是因为后端应用程序处理的是频繁且生命周期较短的请求,而云计算服务是需要长时间运行的,如果后端应用程序运行时间过长,就会造成请求超时和Web应用服务器线程阻塞等问题。例如,前端发送一个视频转码请求到后端应用程序,后端应用程序接收到该请求后,会开启云计算服务的视频转码服务并返回结果,而云计算服务的转码服务会持续执行一段时间,如图5.1所示。
图5.1 视频转码任务的调度流程
云计算开发语言及其框架
由于云计算服务软件应用场景众多,且不同开发语言的擅长领域有所区别,所以云计算服务软件的开发语言是不固定的。例如,人工智能方向的云计算服务软件一般是使用Python编写的,大数据方向的云计算服务软件一般是使用Java或Python编写的,音视频方向的云计算服务软件一般是使用C++编写的。
至于云计算服务软件的框架,也是不统一的,一般是开发团队根据实际情况搭建的。搭建云计算服务软件框架需要考虑很多问题,如任务调度、异常重试、弹性伸缩和任务进程管理等,这些问题都需要长时间的验证和试错,这无疑会增加自建云计算服务的难度。不过,一套稳定的云计算服务软件框架,无疑会成为大型网站系统的强大后盾。
注意:如果云计算服务与海量数据分析相关,那么可以使用现今比较流行的Hadoop框架。然而本章介绍的是通用的云计算服务,因此不会对Hadoop展开介绍。
云计算服务软件的工作原理
通过5.1.1小节的学习可知,后端应用程序与云计算服务软件是相互独立的,且一般是多对多的关系,如图5.2所示。其中,应用程序1到应用程序4指的是相同的后端应用程序,它们部署在不同的服务器上,服务软件1到服务软件4指的是相同的云计算服务软件,它们可能部署在一个或多个服务器上。一般情况下,同一时间内,一个云计算服务软件一次只能处理一个任务。
图5.2 后端应用程序与云计算服务软件的多对多关系
说明:图5.2中的应用程序1到应用程序4指的是相同的后端应用程序。
因为在大型网站系统中,后端应用程序需要处理大量的请求,而单个服务器的处理能力有限,所以相同的后端应用程序会被部署在多个服务器上。
在了解了后端应用程序和云计算服务软件的关系后,下面开始介绍云计算服务的工作原理。云计算服务按任务的生命周期和云计算服务软件的稳定性可以分成任务发布和任务回馈、任务进度或中间结果、任务变更、云计算服务软件监控4个部分。
注意:以下介绍的云计算服务软件的工作原理是基于通用场景介绍的,具体实践可能会有所差异,读者需要根据实际情况斟酌参考。
1.任务发布和任务回馈
由于后端应用程序和云计算服务是多对多的关系,而且云计算服务执行一次任务一般需要较长的时间,即任务发布时可能没有空闲的云计算服务软件(存在任务无法立刻被执行的情况),所以需要在后端应用程序与云计算服务之间添加一个任务池,作为后端应用程序和云计算服务间接通信的枢纽。
任务发布时,后端应用程序生成唯一的任务ID,然后把任务发布到任务池中,并把任务标记为“等待”状态,且将状态记录在数据库中(也可以记录在Redis等非关系型数据库中)。多个空闲的云计算服务软件会在任务池中监听任务,一个任务只会被一个云计算服务软件占有。一个云计算服务软件取得任务后,开始执行任务并通知后端应用程序“任务开始执行”,后端应用程序把任务状态改为“开始”。
任务处理完毕后或发生异常时,云计算服务软件向后端应用程序回馈结果,回馈的结果包括错误码及其描述,以及任务结果参数等。后端应用程序把任务状态改为“结束”,并把错误码及其描述以及任务结果参数记录下来。
任务发布和任务回馈的流程如图5.3所示。其中,云计算服务通知后端应用程序的方式一般是直接调用后端应用程序提供的RESTful API。
图5.3 任务发布和任务回馈流程
2.任务进度或中间结果
在任务执行期间,前端往往需要获取任务进度或一些中间结果,以视频转码为例,前端需要获取视频文件的转码进度。而获取任务进度或中间结果的最直接方法,应该是前端向后端应用程序发送请求,后端应用程序从云计算服务获取任务进度或中间结果。
但是,由于后端应用程序和云计算服务是多对多的关系,后端应用程序直接从云计算服务获取任务进度或中间结果的做法实际上是十分烦琐的,所以需要在后端应用程序与云计算服务之间添加一个进度数据池,作为后端应用程序和云计算服务间接通信的枢纽。
任务开始后,云计算服务软件定期向进度数据池更新任务进度或中间结果,后端应用程序根据任务ID从进度数据池中获取对应任务的进度或中间结果,如图5.4所示。
图5.4 任务进度或中间结果获取流程
3.任务变更
在执行任务期间,云计算服务还需要处理任务的变更,例如取消任务、暂停任务、设置变更和执行指令等。当发生任务变更时,后端应用程序需要通知正在执行该任务的云计算服务软件。为了实现这样的目的,需要在后端应用程序与云计算服务软件之间增加一个指令池。
每个云计算服务软件在初始化时都需要向指令池注册一个独有的消息队列并监听该消息队列。当开始执行任务时,云计算服务软件在通知后端应用程序“任务开始执行”时需要携带指令池中的消息队列标识,后端应用程序需要把消息队列标识记录到数据库中(也可以记录到Redis等非关系型数据库中)。
当需要执行任务变更时,云计算服务软件根据消息队列标识向指令池发送任务指令,云计算服务软件从指令池中获取任务指令后开始执行任务指令。任务变更流程如图5.5所示。
图5.5 任务变更流程
4.云计算服务软件监控
加入了任务池、进度数据池和指令池后,云计算服务软件就可以顺利地执行任务。由于一个云计算服务软件在同一时间只能处理一个任务,因此在一个服务器当中存在多个同时运行的云计算服务软件。这些云计算服务软件是独立运行的,运行的过程中可能会发生意想不到的错误、崩溃和异常退出等情况,当出现这些问题时,云计算服务软件需要被重新启动。
说明:当云计算服务软件出现错误、崩溃和异常退出等情况时,当然是需要被修复的。但是这些问题往往是在正式运营后才会逐渐浮现出来的,而且这些问题往往需要特殊的条件才能触发(一般情况下不会发生)。因此,如果云计算服务软件异常退出后可以重新启动,则大概率能降低该特殊情况造成的影响。因此,在每个运行云计算服务软件的服务器中都需要一个监控软件,其职责为监控和启动云计算服务软件。在服务器开机启动时,监控软件会按配置启动几个云计算服务软件并记录其进程ID。云计算服务软件在运行过程中,需要定时向监控软件汇报当前状态(运行或空闲状态)。
由于云计算服务软件和监控软件是相互独立的,所以在它们之间需要加入一个状态数据池。云计算服务软件向监控软件汇报当前状态时,只需要向状态数据池写入其状态即可。监控软件检查云计算服务软件的状态时,也只需要读取状态数据池中的相关数据即可。
监控软件定时检查各个云计算服务软件的状态,若存在长时间未汇报的云计算服务软件,则判定为该软件已经发生异常。当发现异常的云计算服务软件时,监控软件凭借进程ID将其销毁(存在异常软件已经自动退出的情况),并启动新的云计算服务软件。另外,当所有的云计算服务软件处于运行状态时(执行任务时),监控软件根据具体情况(当前CPU和内存的使用率、配置的最大云计算服务软件个数),决定是否启动新的云计算服务软件。
另外,一个云计算服务软件在执行完几次任务后需要自动退出,不可长时间运行。云计算服务软件自动退出后,由于其不再向状态数据池更新状态,监控软件会认为该软件发生了异常,进而启动一个新的云计算服务软件。
云计算服务软件的自动消亡和重启,可以避免一些由于长时间运行而造成的问题,如内存泄漏等。一般情况下,软件需要经过长年累月的测试与修复,才能达到长时间稳定运行的程度(如Tomcat)。但是,即使是这些稳定的软件,也难免会受到操作系统或某些物理因素的影响而发生异常。而一般的云计算服务软件,其实只需要保证一个或几个任务周期内顺利运行即可,无须保证长时间运行的稳定性。
通过自动消亡和重启云计算服务软件,可以规避一些稳定性的问题,也能节省一些开发成本。
综上,在一个服务器内,监控软件与云计算服务的工作流程如图5.6所示。其中,由于监控软件也可能存在异常退出的情况,所以监控软件也应该被监控。对于监控软件的监控将会在5.6节“监控软件的构造”中详细介绍。
图5.6 监控软件与云计算服务的工作流程
本文给大家讲解的内容是大型网站架构的技术细节:云计算服务的工作原理
- 下篇文章给大家讲解的内容是大型网站架构的技术细节:云计算服务架构需要解决的问题
- 感谢大家的支持