偶然看到了gearman的介绍,顺便安装实验了一下,配置简单(但我自己编译却没有成功,最后直接安装OS软件源中的版本),使用方便(有很多语言的客户端API),功能强大。在结构方面可以参见下图:

从上面的结构中可以看出,worker层可以是N台机器的集群,并可以很方便的随时进行扩展以增加处理能力,Job Server层来负责任务的调度和分配,承担对worker层集群机器的负载均衡控制和健康检查(如果某台worker机器宕机,jobserver会不再把任务发送给这台机器)。client端可以根据不同的业务来连接不同job server(即使连接同一批jobserver也可以,jobserver会根据任务的不同:如调用不同的函数将任务指派给实现了这些函数的worker机器上)。同时,jobserver也通过和memcached集合提供了任务的“持久化”功能,jobserver会将收到的任务首先存储在memcached里面,这样即使所有woker集群机器都宕机了,也不会丢失任务序列,在worker机器重新投入工作之后,jobserver会将任务再依次发送给worker机器进行处理(如果你的memcache挂了,那就悲剧了)。

大概总结了一下,gearman可以在以下场景中考虑使用:

1、分布式计算:比如同时需要执行两个任务,那么可以将第一个任务指派给一批worker,另一个任务指派给另一批worker,这样会加快处理速度,同时借助于负载均衡,可以让每批worker中的机器更均衡的承担工作。

2、消息系统:成熟的消息系统有很多,但gearman完全可以胜任一个MessageQueue的工作

3、异步处理:可以通过客户端发送一个background类型的任务给jobserver,然后继续处理后续的逻辑,以提供给用户更好的使用体验(如注册成功之后发送邮件给注册邮箱)

4、多语言系统的集成:和REST、RPC等风格比较起来,gearman可能会简洁很多。worker和client可以使用不同的语言来处理,双方只需要约定好数据格式即可。

PS:gearman默认是通过memcached来持久化任务队列,也可以使用postgresql 、sqllite、mysql(截止当前,ubuntu源中的gearman尚不支持mysql,也就是不支持libdrizzle,我安装libdrizzle以及drizzle-plugin-gearman-udf等也仍然不能使用,如果采用最新版本的源代码编译安装应该就没有这个问题了)等数据库来存储,这样比memcached更”持久”,毕竟memcached一旦重启服务就完蛋了。详细配置可以参见:http://gearman.org/index.php?id=manual:job_server