随着互联网的发展,一切都在悄然发生这变化。这个事实连街头晒太阳的老大爷都知道。可是互联网真正的影响到了我们什么,切切实实的影响到了我哪些地方。让我的生活变得怎么样了。每个人都有不同的了解。
作为一个互联网后台的开发工程师,互联网的发展对我最大的影响,就是我需要处理越来越多的后台请求。单台服务器不能承受,就部署多台服务器,多台服务器,就涉及到任务调度的问题。最初的解决办法,就是多台服务器之间相互调度,自动寻找组内的"活的"服务器,并将任务分配给他们。如下图的部署方式。
(图中的服务并不一定代表一台服务器,也可能是一台服务器上的多台服务)
负载均衡会分配任务给n个服务。被分配到任务的服务,会将任务分配出去(也有可能会自己处理)。这个时候,分配任务的服务器,就需要知道,整个的集群服务中,有哪个服务还活着。这样才能保证,不会将一个任务分配给死掉的服务。我们称这种方式为同步模式,也就是说,整个任务的处理,是同步的,从服务器得到任务,到任务执行,都是同步的,都是上一级主动调用下一级,并且保证任务执行完毕后,返回结果。
这样做的前提,就是一个集群内的服务,必须得知道该集群内的其他服务是否“活着”,以保证能够给活着的服务分配任务。为了保证这个前提,就需要每个服务主动告诉集群内的其他服务:我还活着!
当集群内有少数服务的时候,这种调度方案是可行的,并且会具有比较高的效率。
设想一下,当组内的服务数比较多时,每个服务都会定期告诉其他服务,我还活着,就会觉得恐怖。假设通知都是定时的,那么每个通知周期,整个集群会发送多少条信息:假设有n个服务,每个服务在每个通知周期都会通知其他服务一次。这样,每个通知周期内,每个服务都会发出n-1条通知(通知其他服务自己的状态)。整个集群内部会发出n*(n-1)条通知。通知的增长量级为:θ(n²),并且通知的频率还会比较高。这样的话。整个集群的内耗会非常严重。当集群部署量超过个位数的时候,整个集群的内耗会让你不由自主的开辟新的部署模式。
下面分析一下这个问题出现的原因:
1、因为单个服务不能完成比较搭的访问量,所以需要增加服务。
2、为保证多台服务均匀调度,我们采取“类多播”模式维护服务的状态。
3、维护服务状态的过程中,当任务比较多时,带来的集群内耗比较多。严重影响了性能。
由上面的分析可以看出,单台服务器的性能,肯定是有提升极限的,集群的部署模式,是不能被否定的。然后我们所能提升的,就是集群的任务调度模式。
上面我们可能说的不是很清楚,也许会有人疑惑,为什么不单独部署一台任务调度服务,用来专门调度任务分配。如果这么想,只能说你是个新手,因为任何的服务都有down掉的时候,如果那台任务调度的服务down掉了,哈哈,你该去智联转转了。所以我们采取的是:每台服务既是调度者,又是处理者。这样无论down掉几台服务,都能保证剩余的服务在正常的工作。
分析完了,也解释完了,我们发现:瓶颈出现在了维护服务的状态过程中。
如何搞掉这个问题呢。我们能不能想办法搞掉服务的状态,不用再让每个服务需要花费大量的资源去维护自己的状态。
下回分解!