1、Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。Gearman提供了一种通用的程序框架来将你的任务分发到不同的机器或者不同的进程当中。它提供了你进行并行工作的能力、负载均衡处理的能力,以及在不同程序语言之间沟通的能力。Gearman能够应用的领域非常广泛,从高可用的网站到数据库的复制任务。总之,Gearman就是负责分发处理的中枢系统,它的优点包括: 开源:Gearman免费并且开源而且有一个非常活跃的开源社区,如果你想来做一些贡献,请点击 。 多语言支持:Gearman支持的语言种类非常丰富。让我们能够用一种语言来编写Worker程序,但是用另外一种语言编写Client程序。 灵活:不必拘泥于固定的形式。您可以采用你希望的任何形式,例如 Map/Reduce。 快速:Gearman的协议非常简单,并且有一个用C语言实现的,经过优化的服务器,保证应用的负载在非常低的水平。 可植入:因为Gearman非常小巧、灵活。因此您可以将他置入到现有的任何系统中。 没有单点:Gearman不仅可以帮助扩展系统,同样可以避免系统的失败。
2、Gearman 简介 通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。Gearman运行过程 一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。 Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。 Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。 Worker:请求的处理者,可以是 C,PHP,Perl 等等。 因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。 甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
3、<?php// Reverse Client Code$client = new GearmanClient();$client->addServer();print $client->do("reverse", "Hello World!");此代码初始化Client类,配置它使用Worker与add_server(没有参数意味着使用127.0.0.1的默认端口),然后告诉ClientAPI与工作量“你好世界运行的反作用!“。函数名和参数都是完全任意的涉及到Gearman,所以你可以发送任何数据结构,是适合您的应用程序(文本或二进制)。在这一点上,Gearman ClientAPI将打包的工作为Gearman协议包发送到服务器的工作,找到一个合适的Worker,可以运行的反函数。现在让我们看一下工人代码:<?php // Reverse Worker Code $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction("reverse", function ($job) { return strrev($job->workload()); }); while ($worker->work());这段代码定义了一个函数my_reverse_function接受一个字符串并返回该字符串的反转。它被一个工作对象用来注册一个名为“反向”的函数,该函数在安装后与Client连接到同一个本地Job server上。当Job server接收要运行的job时,它会查看已注册函数名的工人列表,并将job转发给freeworkers之一。Gearman工人API将这一要求,运行功能my_reverse_function,并将结果返回,函数通过job到client的工作。正如您所看到的,client和worker API(以及job server)处理作业管理和网络通信,所以您可以专注于应用程序部分。有几种不同的方式可以运行在Gearman工作,包括异步处理背景的优先工作。详情请参见各种API的文档。
4、Gearman Useful好吗?上面的反向例子似乎是运行一个函数的很多工作,但是有很多方法可以使用。最简单的答案是,你可以使用Gearman作为一个client和一个worker用不同语言之间的接口。如果你想让你的PHP Web应用程序调用一个函数,用C写的,你可以使用PHP client API与C worker的API,并坚持工作的job server中。当然,还有更有效的方法去做(比如写在C一个PHP扩展),但你可能想要一个PHP client和Python的worker,或者一个MySQL客户端和Perl的worker。您可以轻松地混合和匹配任何支持的语言界面,您只需要所有的应用程序都能够理解正在发送的工作负载。你最喜欢的语言还不支持吗?参与的项目,它为你或一个现有的Gearman开发商把语言包装上的C库可能是相当容易的。Gearman能有用的下一个方法是把worker的代码在一个单独的job(或job群集),更适合做这项工作。说你的PHP Web应用程序要做的图像转换,但这是太多的处理在Web服务器的机器运行它。你可以从船的图像到单独的一组worker的机器来做转换,这种方式的负载不影响您的Web服务器和其他的PHP脚本的性能。通过这样做,您也得到了一个自然的负载平衡形式,因为job服务器只向空闲的worker发送新的作业。如果所有在指定机器上运行的worker都很忙,你就不必担心会有新的jobs被送到那里。这使得扩展与多核心服务器相当简单:你有16个核心的工人机?启动16个实例的worker(或更多,如果他们不是CPU绑定)。另外还需要添加新的机器来扩展您的工作池,只需启动它们,安装工作代码,并将它们连接到现有的作业服务器。Gearman集群现在你可能问工作服务器怎么死的?您可以运行多个job服务器,并让client和worker连接到它们配置的第一个可用的job服务器。这样,如果一个job server死亡,clients和workers会自动转到另一个job server上。您可能不想运行太多的job servers,但有两个或三个冗余的好主意。图显示了一个简单的Gearman集群可以看看。从这里,您可以根据需要扩展您的clients和workers。工作服务器可以轻松处理数百个clients和workers连接在一次。您可以在容量允许的情况下绘制自己的物理(或虚拟)机器线,这可能会将负载分配给任意数量的机器。有关特定用途和安装的详细信息,请参见示例部分。更新来。