特点

Gearman是一个分布式应用程序框架,支持同步、异步任务处理,负载均衡以及跨语言调用。通过Gearman,在WEB应用中可以将复杂的业务逻辑交给其它更适合的机器或进程,甚至不同的语言处理。Gearman是分布式计算的神经中枢,它具有以下特性:

1.开源免费Gearman有一个很活跃的开源社区,提供了比较丰富的资源。

2.多语言支持Gearman提供了多语言接口支持,可以在客户端(Client)使用一种语言提交任务,在工作站(worker)使用使用并一种语言完成该任务。

3.灵活性Gearman不绑定任务特定的设计模式,你可以很方便快速的将它集成到具体项目中。

4.快速Gearman使用简单的协议以及经过优化的应用程序接口,服务器端使用C/C++编写,资源开销小。

5.可嵌入Gearman是轻量的,将它引入到项目中,并不需要太大的成本和开销。

6.无单点故障问题Gearman支持JobServer冗余和故障自动切换。

7.无消息大小限制问题Gearman可以支持单个消息4BG的大小,如果需要更大的消息传送,Gearman可以将消息进行分块处理。

工作模式

分布式框架-Gearman_第1张图片



Gearman分布式框架由三个部分组成:客户端(Client)、工作站(Worker)以及任务服务器(JobServer)Client负责创建任务并发送到JobServer上,JobServer找到一个适合运行该任务的Worker来执行,Worker执行完成后将结果返回给JobServerJobServer再将结果返回给ClientGearman提供了完整的Client APIWorker API供应用程序与JobServer进行交互,因此,开发者无需考虑网络和任务映射的问题。当然,在内部实现上,GearmanClient以及Worker JobServer使用的是TCP socket通信。

要解释Gearman是如何工作的,可以来看一下官网上提供的一个简单例子:对一个字符串进行倒序。该例子使用PHP编写,当然,其它语言的调用也大同小异。

首先我们实现一段Client代码,负责发送一个任务并等待任务结果,最后将结果打印出来。要完成这些,我们需要使用GearmanClient API发送数据以及一个与Worker端关联好的函数名,在该例子中,使用的函数名是reverse。代码如下:

$client = new GearmanClient();
$client->addServer();
print $client->doNormal("reverse", "hello, World!");

这些代码初始化一个client类,并使用addServer配置所要用到的JobServer(不指定参数将使用127.0.0.1上指定的默认端口4730),并告诉client API使用"Hello, World!"运行reverse函数。就Gearman而言,函数名和参数完全是任意的,你可以发送适合应用程序的任意数据结构(包括文本和二进制)。这时,Gearmanclient API会将任务打包成一个Gearman协议数据包并发送到JobServer上,JobServer找到一个合适的worker来运行reverse函数。现在,该看看Worker端的代码了:

$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", function($job) {
        returnstrrev($job->workload());
});
while($worker->work());

分布式框架-Gearman_第2张图片

这段代码定义了一个函数,功能是拿到一个字符串并且返回该字符串的反序。它使用一个worker对象注册一个被命名为reverse的函数名(正好,这个名称就是Cient指定的那个名称),然后连接到与Client连接相同的JobServer上。当JobServer接收到需要运行的任务时,它会先查找worker的注册列表,看看有谁注册了叫reverse的函数名,然后将任务发给闲着的其中一个workerGearman中的worker API收到这个任务请求以后,运行它的reverse函数,然后将结果通过JobServer回传给client.

正如你所看到的,client APIworker API(连同JobServer),会处理任务管理和网络间通信,因此,你需要专注的仅仅是应用程序具体的业务逻辑部分。在Gearman中,你当然也可以用其它方式来运行任务,比如异步任务和分级任务。


适合做什么

对于一些简单的应用,比如实例中的反序字符串,显然不适合将Gearman引入,但是对于一些很复杂的逻辑,而且是当前项目中的主语言无法很好完成的逻辑,这时Gearman的神威就发挥出来了。比如,PHP中,在Web Server处理请求时,需要对外请求很多接口,如果串行请求,显然是浪费时间的,但是并发的请求,Web Server执行模式下又显得力不从心,此时,可以将请求接口的任务交给后台的WorkerWorker是在命令行模式下运行,可以使用PHP的多线程的并发性来做这事,当然了,也可以交给后台的C++来做,就更完美了。Gearman本身可以认为是不同语言之间的桥梁。


部署

Gearmanworker服务可以部署在不同的机器或机器集群上,对任务进行分布式处理。比如在WEB应用程序中需要做图片转换,而在Web Server上运行这样的任务需要很长的处理时间,这时,你可以将图片发送到另外机器上的worker进行处理,这样就不会对WEB服务器的性能造成影响,同时,也可以达到负载均衡的效果。Worker池可以根据需要进行灵活部署。

分布式框架-Gearman_第3张图片

为了解决JobServer挂掉的问题,我们可以起2-3JobServer进行冗余,并且所有的clientworker都配置到这些JobServer上,默认连接第一个可用的JobServer,如果其中一个挂了,另外一个JobServer可以继续提供服务。JobServer可以同时轻易的处理数以百计的请求,因此JobServerWorker的部署量相比,不需要太多。上图是展示了一个简单的Gearman集群构架。