Gearman介绍php
Gearman是一个用来把工做委派给其余机器、分布式的调用更适合作某项工做的机器、并发的作某项工做在多个调用间作负载均衡、或用来在调用其它语言的函数的系统。web
一般,多语言多系统之间的集成是个大问题,通常来讲,人们多半会采用 WebService 的方式来处理此类集成问题,但无论采用何种风格的WebService,如 RPC 风格,或者 REST 风格,其自己都有必定的复杂性。相比之下,Gearman 也能实现相似的做用,并且更简单易用。算法
对于分布式网络环境或者有大量任务的应用,咱们须要将任务在不一样的服务器之间进行分布,这个时候正好是Gearman发挥实力的时候。虽然咱们也可使用MQ队列再加一些本身实现的调度算法来将任务进行分发,可是既然已经有了成熟的产品,为何不使用下呢。
数据库
Gearman提供了一种通用的程序框架来将你的任务分发到不一样的机器或者不一样的进程当中。它提供了你进行并行工做的能力、负载均衡处理的能力,以及在不一样程序语言之间沟通的能力。Gearman可以应用的领域很是普遍,从高可用的网站到数据库的复制任务。总之,Gearman就是负责分发处理的中枢系统,它的优势包括:
开源:Gearman免费而且开源并且有一个很是活跃的开源社区,若是你想来作一些贡献,请点击 。
多语言支持:Gearman支持的语言种类很是丰富。让咱们可以用一种语言来编写Worker程序,可是用另一种语言编写Client程序。
灵活:没必要拘泥于固定的形式。您能够采用你但愿的任何形式,例如 Map/Reduce。
快速:Gearman的协议很是简单,而且有一个用C语言实现的,通过优化的服务器,保证应用的负载在很是低的水平。
可植入:由于Gearman很是小巧、灵活。所以您能够将他置入到现有的任何系统中。
没有单点:Gearman不只能够帮助扩展系统,一样能够避免系统的失败。
小程序
Gearman架构和工做原理服务器
使用Gearman的应用一般有三部分组成:一个Client、一个Worker、一个任务服务器。 Client的做用是提出一个 Job 任务 交给 Job Server 任务服务器。Job Server 会去寻找一个 合适的 Worker 来完成这项任务。Worker 执行由 Client 发送过来的 Job,而且将结果经过 Job Server 返回给 Client。Gearman 提供了 Client 和 Worker 的 API,利用这些API 应用能够同 Gearman Job Server来进行通讯。Gearman 内部 Client 和 Worker 之间的通讯都是经过 TCP 链接来进行的。工做的流程以下图所示:网络
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Gearman client:提供gearman client API给应用程序调用。API可使用C,PHP,PERL,MYSQL UDF等待呢个语言,它是请求的发起者。
Gearman job server:将客户端的请求分发到各个gearman worker的调度者,至关于中央控制器,但它不处理具体业务逻辑。
Gearman worker:提供gearman worker API给应用程序调用,具体负责客户端的请求,并将处理结果返回给客户端。数据结构
由于 Client,Worker 并不限制用同样的语言,因此有利于多语言多系统之间的集成。
甚至咱们经过增长更多的 Worker,能够很方便的实现应用程序的分布式负载均衡架构。架构
Gearman基本使用方法并发
Gearman首先提供了一个多语言通信的接口,固然还有比这个更简单有效的办法。Gearman能够将工做的负载分担到不一样的机器中,以下图所示:
Gearman不但能够作为任务分发,还能够作为应用方面的负载均衡。可让worker放在不一样的一堆服务器上,也能够启动放在同一个cpu的多个核上。好比,应用视频转换程序,不但愿web服务器来处理视频格式转换,这时,能够在这一堆服务器上进行任务分发,在上面加载worker处理视频格式,对外的web服务器就不会被视频转换过程影响。并且扩展方便,加一台服务器到任务调度中心,注册成worker便可,这时job server会在请求到来的时候,将请求发送给空闲的worker。
Job Server 能够开启多个实例,组成HA架构,这样在其中一个发生故障的时候,client和worker会自动 Failover 到其余的机器上。
简单来说,就是下面的流程
如图
从上面能够看出来 Worker 是可扩展的.若是你有须要 Worker 是能够运行任意多个的.
另外,咱们对 Application 是不用过多在乎的.一样也是能够多个的. Application 的客户只有一个任务,就是加入任务到 Gearman 中来.
下面是一个例子,能够详细解释Gearman的工做方式。 下面是一个PHP的反转字符串的例子。
咱们首先写一个client,它负责发送job并等待处理结果,拿到结果后,直接打印出来。这个小程序,使用了Gearman的client API, 把function name和参数一同发送出去,function name是reverse。(省略了错误处理):
// Reverse Client Code
$client= new GearmanClient();
$client->addServer();
print $client->do("reverse", "Hello World!");
上边的代码初始化了一个client类,添加了一个job server(没有参数表示使用127.0.0.1的默认端口),而后告知API执行"reverse" function, workload为 "Hello world". Function name 和 参数不受限制, 因此发送任意的数据结构。从这一点来看,Gearman client API会把job打包为一个Gearman协议数据包,而后发送给job server, 找到一个可以执行reverse的worker。
如今咱们来看下worker的代码:
# Reverse Worker Code
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work());
function my_reverse_function($job)
{
return strrev($job->workload());
}
以上代码定义了一个function “my_reverse_function”,输入一个字符串,输出反转的字符串。咱们把他注册给GearmanWorker的实例,注册的 function name 为"reverse",以后它会被链接到job server(与以前的client链接的是同一个)。 当job server收到执行请求时,会查找worker list,看谁注册了"reverse"function, 而后把请求转发给一个闲置的worker. Gearman worker API会获取这个请求,而后调用注册过的php函数"my_reverse_function",php函数处理的结果会经过server返给客户端。
如你所见,client和worker APIs 处理job管理和网络通讯,因此咱们能把精力集中到应用自己。这里有几种不一样的执行Gearman job的方法,包括后台异步处理和任务排序。
上边反转的例子看起来花了很大的力气去执行了一个function, 但这实际上是有意义的。 一方面,gearman可以让你可以在client和worker使用不一样的语言。若是你但愿用PHP应用调用C的实现,你能够用PHP client API和C的worker API,而后搞一个job server放在中间。固然,跨语言调用有不少解决方案(好比用C写PHP扩展)。
咱们再举一个例子,咱们须要用PHP client去调Python的worker,或者用MySQL client和Perl worker...总之能很容易地实现混搭。若是你心爱的语言尚未API支持,能够参与项目,你或者Gearman的开发者能够很简单的搞一个C lib的封装。
“Gearman颇有用”的第二个理由是,咱们能够把worker扔到其余机器(或集群)上来干活。好比你的PHP web 应用须要作大量的图片处理,但web机没有足够的资源来处理,这样咱们能够搞一台单独的机器来作图片处理,这样,图片处理的负担就不会对web服务器的执 行效率和响应速度形成影响。另外,这样作咱们还可以实现负载均衡,由于job server老是把jobs发给闲置worker.在多核系统上,它的实现也很简单:若是你有一台16核的机器,开启16个worker就可(也许能够开 更多)。添加新机器也是无缝的,在新机器上部署worker 代码,而后把它们连到job server便可。
如今,你可能会问,job server挂了怎么办? 咱们能够起多个job server,让clients和workers链接到配置好的可用的第一个job server. 若是一个job server挂掉,clients和workers自动找其余的可用的job server。开2-3个job server是不错的选择。上图是一个简单的集群的样子。
这样子,你就能够方便地扩张clients和workers了。job server能够轻松抗住上百个clients和workers同时链接。