PS:Gearman内部 Client,Job Server,Worker之间TCP协议的工作流程细解。
Gearman工作流程细解
Gearman的三个角色:Client -> Job Server -> Worker。
前台job-同步阻塞工作流程图
- worker向Gearman Server注册可以执行的功能function
- worker尝试获取一个job
- server通告worker暂无job
- worker通告server:”我先睡会,有活干时再叫醒我”
- client向server提交了一个job,建立tcp连接
- server将job放入队列后向client返回了”Created”(已接收成功)状态
- server唤醒可以完成这项工作的worker(可能会唤醒多个woker)
- worker向server发起请求,尝试获得一个任务
- server选定一个worker,将该job分配给选定的worker
- 在”Doing job”过程中,client向server发起job status查询
- 在”Doing job”过程中,server向client返回运行状态
- worker辛苦工作一段时间后,向server通告“干完了”
- server接受worker的结果并转发给client
- client接受结果并关闭连接
由上图可知,client端在job执行的整个过程中,与job server端的链接都是保持着的,这也给job完成后job server返回执行结果给client提供了通路。同时,在job执行过程当中,client端还可以发起job status的查询。当然,这需要worker端的支持的。
后台job-异步非阻塞工作流程图
由上图可知,client提交完job,job server成功接收后返回JOB_CREATED响应之后,client就断开与job server之间的连接了。后续无论发生什么事情,client都是不关心的。同样,job的执行结果client端也没办法通过Gearman消息框架获得。
解释说明
1. 任务分类:
按优先级分:普通(SUBMIT_JOB),高优先级(SUBMIT_JOB_HIGH),低优先级(SUBMIT_JOB_LOW)
按执行方式分:前台-同步阻塞(_JOB_HIGH,_JOB_LOW),后台-异步非阻塞(_JOB_HIGH_BG,_JOB_LOW_BG)
前后台任务最大区别在于,”前台任务”发送job到job server后会一直等待work给它处理并返回结果,在此过程中,前台任务一直阻塞当前脚本往下执行,直到获取返回值!而”后台任务”仅仅是发送job到job server这个过程就结束了,所以client可以跟踪前台任务的工作状态,而不能跟踪BG(后台)任务
2. 任务工作状态的时时通信(worker–>server–>client):
WORK_DATA
WORK_STATUS 对于长任务,worker应该每隔一段时间通告任务状态
WORK_COMPLETE
WORK_FAIL
WORK_EXCEPTION
WORK_WARNING
worker在执行job的过程中可以时时传送部分data或者处理status返回给client的,说明worker和client在处理的时候是可以时时通信的
3. Server监控
Gearman有“Administrative Protocol”专门用于对Gearman Server的监控,主要涉及以下几方面:
status:所注册职能分类,worker总数目,处于工作状态的worker数目,可用worker数目等
worker的详细信息:所注册功能、IP
server的缓存任务最大队列长度:可以被查询也可以被设定