Gearman是一款可以加速工作流的开源作业处理框架,通过Gearman,广泛的应用可以通过简单的作业触发API来加速工作流程,极大地提高了工作效率和系统可靠性。在这篇文章里,我们会深入了解Gearman的架构、功能、优缺点,以及如何使用Gearman来加速你的工作流程。
Gearman架构
Gearman基于客户端/服务端架构,通过Gearman Job Server(服务)来协调客户端(应用程序)和工作者(承担实际工作的程序)。因此,Gearman实现了任务分发和多个工作者并发处理的功能,可用于构建分布式和面向服务的应用程序。下图显示了Gearman的基本架构。

1.客户端
Gearman客户端负责将作业请求提交到Job Server。客户端可以是任何应用程序或者脚本语言,只要它可以执行Gearman客户端库。客户端库提供了不同环境下的API,并负责将请求报文发送到Job Server。
2.Job Server
Job Server是Gearman的核心组件,它接受客户端提交的作业请求,并将其分派给一个或多个工作者。Job Server可以在单独的服务器上运行或者与客户端应用程序一起运行在同一台服务器上。
Job Server具有有向图数据结构,该数据结构用于保存被提交的任务和相关的工作者。当客户端提交一个任务时,Job Server会将任务添加到有向图数据结构中,并将任务派给工作者进行处理。
3.工作者
Gearman工作者是能够承担实际工作的程序,通常是后台服务,例如执行计算密集型的算法、数据库查询、转换文件格式,发送邮件等操作。对于每个提交的任务,Job Server会将其派给一个可用的工作者进行处理。每个工作者处理完成后,Job Server会将结果返回给客户端。
Gearman功能
Gearman提供了许多功能,这些功能使得开发更加简单,并可以为服务端和客户端提供许多优化。这里我们列出Gearman最显著的功能:
1.分布式处理
通过分派任务到多个工作者,Gearman具备分布式处理的能力,可以处理大量任务,提高工作效率并减少错误。分布式处理有助于避免和管理服务器负载和单点故障问题。
2.多语言支持
Gearman支持多种编程语言,这使得开发人员可以使用自己熟悉的语言进行开发,而不必担心平台或技术无法配合,无需显式地考虑系统架构或通讯流程。
3.群集管理
Gearman提供了库和工具,以管理一个或多个Gearman Job Server。Gearman支持由Heartbeat软件包提供的冗余节点。如果主节点故障,则从节点自动接管。
4.动态调度
Gearman支持动态调度,它可以将任务发送到网络上最快的工作者,从而使整个工作流程更流畅,节约运行时间,提高整个系统的可靠性。
5.异步任务
异步任务是Gearman的重要特性之一,它为短暂但不想在请求响应中等待的大量任务提供了解决方案。Gearman通过异步任务在请求的同时接收计算,从而节省CPU等待时间,并多干其他任务,让处理任务的效率变得更高,进而使响应速度更快。
Gearman优缺点
Gearman有许多优点,这是为什么许多人选择它的原因。下面我们分别介绍Gearman的优点和缺点。
Gearman优点:
1.多语言支持。
2.分布式处理。
3.完善的群集管理。
4.动态调度。
5.异步任务。
6.扩展性强。
Gearman缺点:
1.适合处理大量短暂的任务。
2.基于客户端/服务端架构,依赖中央节点。
3.没有内置的安全性措施,需要开发人员自己加入安全功能。
4.异步任务返回时必须使用回调函数,这很难处理大量任务。
使用Gearman加速工作流程
下面我们将解释如何使用Gearman来加速工作流。
首先我们需要下载Gearman Job Server。具体的下载地址是https://gearman.org/download。
Gearman的PHP扩展可以在下载页面上找到。
Gearman PHP扩展可以通过PECL程序安装。安装命令如下:
```
pecl install gearman-1.1.2
```
下面我们将如何进行Gearman任务的运行。
1.在Linux系统下运行Gearman Job Server,并启用它:
```
$ gearmand -d
```
在默认情况下Gearman Job Server监听127.0.0.1:4730端口。
2.创建Gearman客户端。这一步需要创建客户端代码来将任务提交给Job Server。下面是一个示例PHP代码:
```
$gmclient = new GearmanClient();
$gmclient->addServer();
```
在addServer()方法中,我们可以指定Gearman Job Server的IP和端口。如果不指定,则默认为127.0.0.1:4730。
3.创建Gearman工作者。这一步需要创建一个处理器来执行任务。下面是一个示例PHP代码:
```
$gmworker = new GearmanWorker();
$gmworker->addServer();
$gmworker->addFunction("reverse_string", "reverse_string_function");
```
最后一条语句是告诉Gearman Job Server希望将任务传递给关键字“reverse_string”的函数。例如,它会将传递给reverse_string_function函数的参数作为任务参数。
```
function reverse_string_function($job){
return strrev($job->workload());
}
```
4.提交任务。现在我们可以在Gearman Job Server上提交任务。以下是一个示例PHP代码:
```
$job_handle = $gmclient->do("reverse_string", "Hello, world!");
```
do()方法的第一个参数是任务名称,“reverse_string”是我们给工作者定义的关键字。第二个参数是Payload,即要转换的字符串。
5.返回结果。Gearman工作者处理完成后,可以将结果返回给URL地址或其他源。例如,以下是一个示例PHP代码:
```
$job_handle = $gmclient->doBackground("reverse_string", "Hello, world!");
```
有一个预定义的函数,可以检查任务是否完成,而不是每隔一段时间轮询一次,直到结果可用。这个函数是addTaskStatus()。以下是一个示例PHP代码:
```
while($gmclient->jobStatus($job_handle)){
echo "waiting for completion...\n";
sleep(1);
}
echo $gmclient->jobStatus($job_handle) . PHP_EOL;
$job_result = $gmclient->doStatus();
echo "Result: " . $job_result . PHP_EOL;
```
以上就是Gearman在PHP中的基本用法。
结论
Gearman是一种快速,有效,简单的作业处理框架,可以加速工作流程和提高系统的可靠性、性能和韧性。通过处理分布式的服务,基于Client-Server架构,Gearman可以让你更加轻松地开发高效且可扩展的应用程序。为了以最少的时间获得最多的收益,Gearman是最好的选择之一。