Gearman 异步任务软件的介绍

尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面。如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应。实际上,将一个计算密集型的或专门化的功能放在一个或多个独立的专用服务器上运行,效果会更好。

常用的缩略词

producer 指的是生成工作请求的机器;
consumer 是执行工作的机器;
agent 则是连接 producer 与适当 consumer 的中介。

PHP 的 Gearman 库能把工作分发给一组机器。Gearman 会对作业进行排队并少量分派作业,而将那些复杂的任务分发给为此任务预留的机器。这个库对 Perl、Ruby、C、Python 及 PHP 开发人员均可用,并且还可以运行于任何类似 UNIX® 的平台上,包括 Mac OS X、 Linux® 和 Sun Solaris。
向一个 PHP 应用程序添加 Gearman 非常简单。假设您将 PHP 应用程序托管在一个典型的 LAMP 配置上,那么 Gearman 将需要一个额外的守护程序以及一个 PHP 扩展。截止到 2009 年 11 月,Gearman 守护程序的最新版本是 0.10,并且有两个 PHP 扩展可以用 — 一个用 PHP 包裹了 Gearman C 库,另一个用纯 PHP 编写。我们要用的是前者。它的最新版本是 0.6.0,可以从 PECL 或 Github(参见 参考资料)获取它的源代码。

Gearman 的高级特性

在一个 Web 应用程序内可能有许多地方都会用到 Gearman。可以导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 所有这些均不会影响站点的体验和响应性。可以并行地处理数据。而且,由于 Gearman 协议是独立于语言和平台的,所以您可以在解决方案中混合编程语言。比如,可以用 PHP 编写一个 producer,用 C、Ruby 或其他任何支持 Gearman 库的语言编写 worker。
一个连接客户机和 worker 的 Gearman 网络实际上可以使用任何您能想象得到的结构。很多配置能够运行多个代理并将 worker 分配到许多机器上。负载均衡是隐式的:每个可操作的可用 worker(可能是每个 worker 主机具有多个 worker)从队列中拉出作业。一个作业能够同步或异步运行并具有优先级。
Gearman 的最新版本已经将系统特性扩展到了包含持久的作业队列和用一个新协议来通过 HTTP 提交工作请求。对于前者,Gearman 工作队列保存在内存并在一个关系型数据库内存有备份。这样一来,如果 Gearman 守护程序故障,它就可以在重启后重新创建这个工作队列。另一个最新的改良通过一个 memcached 集群增加队列持久性。memcached 存储也依赖于内存,但被分散于几个机器以避免单点故障。
Gearman 是一个刚刚起步却很有实力的工作分发系统。据 Gearman 的作者 Eric Day 介绍,Yahoo! 在 60 或更多的服务器上使用 Gearman 每天处理 600 万个作业。新闻聚合器 Digg 也已构建了一个相同规模的 Gearman 网络,每天可处理 400,000 个作业。Gearman 的一个出色例子可以在 Narada 这个开源搜索引擎(参见 参考资料)中找到。
Gearman 的未来版本将收集并报告统计数据、提供高级监视和缓存作业结果等。为了跟踪这个 Gearman 项目,可以订阅它的 Google 组,或访问 Freenode 上它的 IRC 频道 #gearman。

Gearman 工作模型

How Does Gearman Work?

使用的端口 4730

GearMan 的容错性

不管是把Worker放到单独服务器,还是放到集群服务器,Worker都可以正常运行。

Client发送任务到Job Server中,由Job Server负责调度,Job Server会自动检测空闲的Worker,并发送任务到这个空闲的Worker,Worker进行任务处理。因此,Gearman框架可以实现资源负载平衡。

Gearman框架具有很强的扩展性。这个框架支持多核心CPU。如果Worker所在的服务器太繁忙,可以把服务器的CPU换成更多核心的CPU,如16核CPU,这样就可以在这台服务器上创建16个Worker实例来进行处理。当然,Gearman也支持服务器的扩展,可以很方便地扩展出更多的Worker服务器来处理请求。唯一需要做的事情就是:启动新服务器,安装好Worker程序,并修改配置即可。

如果服务器挂掉了,Gearman会如何处理呢?我们可以同时运行多个Job Server,Client和Worker连接到配置好的Job Server。如果这台Job Server出现故障,则配置到这台的Client和Worker会自动连接到另外一台可用的Job Server。这里建议大家,至少要有两台以上的Job Server,利用冗余来提高系统的容错性。
public bool GearmanWorker::addServer ([ string $host = 127.0.0.1 [, int $port = 4730 ]] ) 单台
public bool GearmanWorker::addServers ( string $servers = 127.0.0.1:4730,127.0.0.2:4730 ) 多台做冗余,提供容错

public bool GearmanClient::addServer ([ string $host = 127.0.0.1 [, int $port = 4730 ]] ) 单台
public bool GearmanClient::addServers ( string $servers = 127.0.0.1:4730,127.0.0.2:4730 ) 多台做冗余,提供容错

猜你喜欢

转载自blog.csdn.net/wjc19911118/article/details/51801352