简介
Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。
Gearman提供了一个通用的应用程序,可以工作在更加适合处理这项任务的其他计算机或其他处理器上。它允许并行处理,载入平衡处理,而且可以在不同语言间进行调用。它可以应用于各种各样的应用场合。
Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资 源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。
优点
以下是关于Gearman的一些优点:
- 开源:完全开源,免费的。
- 多语言:有许多语言接口,而且支持的语言数量一直在增加。
- 灵活:不依赖于任何特定的设计。
- 快速:简单的协议和接口,可以减少现有应用程序的开销。
- 嵌入:轻量,可以以最小的代价引入到现有程序。
- 没有单点故障:具有较强的容错性。
工作原理
Gearman Client:负责发起任务请求,创建Job
Gearman Job Server:负责任务调度,负责把来自Client的Job分发到不同服务器或不同处理器上的Worker。
Gearman Worker:负责Job处理,并通过Job Server返回结果给Client。
Gearman Job Server:负责任务调度,负责把来自Client的Job分发到不同服务器或不同处理器上的Worker。
Gearman Worker:负责Job处理,并通过Job Server返回结果给Client。
Worker工作流程
- Worker通过CAN_DO消息,注册到Job server上。
- 随后发起GRAB_JOB,主动要求分派任务。
- Job server如果没有job可分配,就返回NO_JOB。
- Worker收到NO_JOB后,进入空闲状态,并给Job server返回PRE_SLEEP消息,告诉Job server:”如果有工作来的话,用NOOP请求我先。”
- Job server收到worker的PRE_SLEEP消息后,明白了发送这条消息的worker已经进入了空闲态。
- 这时如果有job提交上来,Job server会给worker先发一个NOOP消息。
- Worker收到NOOP消息后,发送GRAB_JOB向Job server请求任务。
- Job server把工作派发给worker。
- Worker干活,完事后返回WORK_COMPLETE给Job server。
处理时序图
同步
异步
集群
如果Job Server挂了该怎么办,Gearman会如何处理?我们可以同时运行多个Job Server。Clients和Workers通过配置好的Job Server,如果这个Job Server发生故障挂了,会自动故障切换到另一个可用的Job Server。Job Server建议两台以上,通过冗余来提高系统的容错性。You probably don’t want to run too many job servers, but having two or three is a good idea for redundancy.(官网原文)
- 高可用
启动两个job server,他们是独立的服务进程,有各自的内存队列。当一个job server进程出现故障,另一个job server可以正常调度。(worker api与client api可以完成job server故障的切换)。在任何时候我们可以关闭某个worker,即使那个worker正在处理工作任务(Gearman不会让正在被执行的job丢失的,由于worker在工作时与Job server是长连接,所以一旦worker发生异常,Job server能够迅速感知并重新派发这个异常worker刚才正在执行的工作)
gearman内置内存队列,默认情况队列最大容量为300W,可以配置最大支持2^32-1,即4 294 967 295。
- 负载均衡
- 可扩展
- 分布式
gearman内置内存队列,默认情况队列最大容量为300W,可以配置最大支持2^32-1,即4 294 967 295。
- 高性能
使用场景
- 长时间运行的处理:图片处理,订单处理,批量邮件/通知 ...
- 要求高CPU或内存的处理:大容量的数据处理,MapReduce运算,日志聚集,视频编码
- 分布式和并行的处理
- 定时处理:增量更新,数据复制
- 限制速率的FIFO处理
实例-python
Client-单任务
在没有worker启动的情况下,client并不会结束,会阻塞直到worker处理完job。
Client-多任务
同步非阻塞方式发送多个job的例子,在取得server返回结果之前,用了wait_until_jobs_completed函数来等待task中的所有job返回结果。
Worker
对worker而言,则会一直阻塞直到有新的job到来。
GearmanAdminClient
Job Server相关的API,用于监控和设置。
- send_maxqueue(task, max_size): Sends a request to change the maximum queue size for a given task
- end_shutdown(graceful=True): Sends a request to shutdown the connected gearman server
- get_status():Retrieves a list of all registered tasks and reports how many items/workers are in the queue
- get_version(): Retrieves the version number of the Gearman server
- get_workers():Retrieves a list of workers and reports what tasks they’re operating on
- ping_server(): Sends off a debugging string to execute an application ping on the Gearman server, return the response time