Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。 它的优点包括:
- 开源:Gearman免费并且开源而且有一个非常活跃的开源社区,因此他有广阔的发展空间 。
- 多语言支持:Gearman支持的语言种类非常丰富。让我们能够用一种语言来编写Worker程序,但是用另外一种语言编写Client程序。
- 灵活:不必拘泥于固定的形式。您可以采用你希望的任何形式,例如 Map/Reduce。
- 快速:Gearman的协议非常简单,并且有一个用C语言实现的,经过优化的服务器,保证应用的负载在非常低的水平。
- 可植入:因为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不但可以做为任务分发,还可以做为应用方面的负载均衡。可以让worker放在不同的一堆服务器上,也可以启动放在同一个cpu的多个核上。比如,应用视频转换程序,不希望web服务器来处理视频格式转换,这时,可以在这一堆服务器上进行任务分发,在上面加载worker处理视频格式,对外的web服务器就不会被视频转换过程影响。而且扩展方便,加一台服务器到任务调度中心,注册成worker即可,这时job server会在请求到来的时候,将请求发送给空闲的worker。
Job Server 可以开启多个实例,组成HA架构,这样在其中一个发生故障的时候,client和worker会自动 Failover 到其他的机器上。
简单来讲,就是下面的流程
- 启动 Gearman ,监听 7003
- 启动 Worker , 注册功能到服务器上.
- 启动 Client ,请求注册的功能,并提供输入的数据
- Gearman 的服务发送"功能请求"到 Worker.并给 Client 输入的数据传送给 Worker.
- Worker 接收到"功能请求"和输入的数据.并处理输入的数据内容.
- Worker 返回处理的数据结果,服务转发这个结果给客户端.
- Client 客户端接收到处理的结果,并显示结果给用户