本期,我们来聊一下后端程序整合其他应用。
对于这个问题,可能很多人会一笑而过,整合其他应用不就是根据其软件说明对接吗(数据库、SaaS服务)?
但是,云计算、大数据时代,大型网站系统已经不单单是前端、后端程序了。SaaS等云服务也很难完全满足网站系统的全部云计算需求。
比如我们自己写了一个需要长时间运行的Python爬虫程序,后端程序怎么调用呢?通过命令行方式调用吗?
可以是可以,但不可行。
至少对于这种需要长时间运行的程序是不可行的。所以,这里讨论的需要整合的其他应用,并不是指数据库、非关系型数据库、第三方SaaS服务等对接方便的程序。而是指爬虫程序等自己开发的程序,或者需要云服务化的引擎程序,如音视频转码合成引擎等。
我们将分两部分进行讨论
-
运行时间很短,需要同步调用的程序
-
运行时间较长,需要异步调用的程序
运行时间很短,需要同步调用的程序
运行时间很短,需要同步调用的程序,如生成写入某些小文件、获取某些文件数据的脚本程序。
对于这类程序,其实通过命令行调用即可。因为运行时间不长,也就是占用资源其实不多,且需要同步返回结果,所以并不需要考虑太多。
当然,除了命令行调用,还可以使用其他rpc工具调用,或者通过一些工具转换为动态库再调用。
运行时间较长,需要异步调用的程序
接下来是运行时间长,需要异步调用的程序,这类程序,我们一般称其为云计算程序。对于云计算程序有很多定义,但都是易懂的同时又仿佛什么都没说。
我们对于云计算程序的定义很简单,就是需要在服务器长时间运行甚至是一直运行的程序,而后端程序是运行时间很短的程序(整合其他程序)。
云计算程序在现今一些具有规模的系统中已经十分普遍了,如爬虫程序、音视频转码合并引擎、智能数据治理程序、AI推荐算法程序等。当然,这些程序大部分可以通过使用第三方SaaS服务(云服务)完成, 我们也是比较推荐在项目起步阶段优先选择第三方SaaS服务,
但是难以避免的是,平台越来越大 数据私密性、程序定制需求也会越来越高,而且从长远来看,长期使用第三方SaaS服务的话成本也是比较高的。
所以,大型网站系统终归会拥有自身的云计算部分,对于这类云计算程序,因为它们运行期间会占用比较多的资源,一台服务器也只能同时运行有限个云计算程序(一般是几十/几百个)。
如果直接通过后端程序使用命令行同步调用的话,会阻塞其他请求,严重影响系统整体性能, 而且后端接口一般有超时强制回收机制,云计算程序可能会无法持续运行。
另外,一台服务器运行云计算程序的个数也难以控制,可能导致一台服务器运行过多云计算程序反而运行效率更低,也可能出现内存枯竭等原因而导致服务器宕机。
所以,云计算程序是需要特殊处理的。一般做法是,在后端程序与云计算程序中间加一个任务池实现异步调用,这个任务池一般就是消息队列,如RabbitMQ等。
后端程序向任务池发布任务,云计算程序空闲时再向任务池领取任务,这样就能保证云计算程序更加有序地执行。
另外,扩展云计算程序服务器也是简单的,由于后端部分与云计算部分是通过任务池间接关联的 ,所以如果积压的任务过多,直接扩展一个云计算程序服务器就可以了。
当然,任务池仅能满足云计算程序最基本的需求, 整个云计算程序运行的机制仍然是复杂的,因为我们还需要考虑任务状态、任务进度、一键停止、程序消亡等机制。
遵从 “没有趁手的工具就做一个” 的程序员修养,我们做了这样的框架,名叫hive,蜂巢。因为云计算程序本身就好像是一个蜂巢,多个蜜蜂领任务去采蜜,采完蜜回蜂巢再领任务,直到无任务为止。
hive框架已经发布在我们的官网上了,有兴趣的小伙伴可以下载尝试一下, 我们下一期会详细介绍这个框架。当然,我们也相信会有其他同类型的框架,但我们在2016年构造之初,确实没有太好的框架。
总结
云计算、大数据时代,网站系统已经不单单包含前端、后端部分,还有云计算部分。
云计算部分是区别于前端、后端部分的第三部分,专门运行任务时间较长、或者物理资源消耗较多的程序。
云计算程序部分往往也是网站系统的真正技术竞争力,虽然很多人认为SaaS服务能快速解决这个问题。但是实际上,哪家平台愿意共享他们的核心云计算能力呢?况且,SaaS服务本身就是云计算程序 ,没有云计算框架,如何实现可靠的SaaS服务。
针对云计算程序部分,如果大家有更好的解决方案,可以写在评论区或者到我们的技术交流群讨论。