gearman分布式任务调度系统
方少森 @百度
一、总体介绍
gearman是一个分布式任务分发调度框架,支持多语言、并发的任务执行,支持负载均衡。gearman具有如下特点:
1、开源
2、支持多语言接口:php、perl、python、C 等;
3、灵活:不必拘泥与特定的模式,可以灵活使用分布式框架,如map/reduce;
4、速度快,开销小
5、可嵌入,很轻
6、无单点。
二、gearman运行机制简介
gearman包含3个基本组件:client、worker和job server。
client - 创建要运行的任务,并提交给job server。
job-server - 寻最合适的worker,并提交任务给worker。
worker - 接收job server的任务,执行并返回结果,结果通过job server返回给client。
从图中可以看出,client和worker均为gearman提供的api。
三、一个简单的实例
一个基于PHP的实例,功能是用于反转字符串,
client代码:
job server收到任务请求后,会寻一个能够运行“reverse”的worker执行该任务。
worker上的代码如下:
上述事例的运行时序图如下:
四、三角的工作流程
一次正常的Gearman任务执行流程如上图所示:
1. worker向Gearman Server注册自身可以执行的功能
2. worker尝试获取一个任务
3. server通告worker暂无任务
4. worker通告server:“我先睡会,有活干时再叫醒我”
5. client向server发起任务请求
6. server唤醒可以完成这项工作的worker(可能会唤醒多个woker)
7. worker向server发起“饥饿”请求,尝试获得一个任务
8. server选定一个worker,将该任务分配下去
9. 通告client:“我安排别人处理你的请求了,耐心等待吧”
10. worker辛苦工作一段时间后,向server通告“干完了”
11. server将结果反馈给用户
说明:
1. 任务分类:
∙ 按优先级分:普通(SUBMIT_JOB),高(SUBMIT_JOB_HIGH),低(SUBMIT_JOB_LOW)
∙ 按执行方式分:普通(_JOB_HIGH,_JOB_LOW),后台(_JOB_HIGH_BG,_JOB_LOW_BG)——最大区别在于,client可以跟踪前台任务的工作状态,而不能跟踪BG任务
2. 任务工作状态的通告(worker-->server-->client):
∙ WORK_DATA:
∙ WORK_WARNING
∙ WORK_STATUS
对于长任务,worker应该每隔一段时间通告任务状态
∙ WORK_COMPLETE
∙ WORK_FAIL
∙ WORK_EXCEPTION
3. Server监控
Gearman有“Administrative Protocol”专门用于对Gearman Server的监控,主要涉及以下几方面:
status:所注册职能分类,worker总数目,处于工作状态的worker数目,可用worker数目等
worker的详细信息:所注册功能、IP
server的缓存任务最大队列长度:可以被查询也可以被设定
五、通信协议
1、二进制packet格式
所有请求和返回均为二进制数据包,包含header和可选的数据。header包含如下字段:
4 byte magic code - This is either "\0REQ" for requests or "\0RES" for responses.
4 byte type - A big-endian (network-order) integer containing
an enumerated packet type. Possible values are:
# Name Magic Type
1 CAN_DO REQ Worker
2 CANT_DO REQ Worker
3 RESET_ABILITIES REQ Worker
4 PRE_SLEEP REQ Worker
5 (unused) - -
6 NOOP RES Worker
7 SUBMIT_JOB REQ Client
8 JOB_CREATED RES Client
9 GRAB_JOB REQ Worker
10 NO_JOB RES Worker
11 JOB_ASSIGN RES Worker
12 WORK_STATUS REQ Worker
RES Client
13 WORK_COMPLETE REQ Worker
RES Client
14 WORK_FAIL REQ Worker
php实例计算 RES Client
15 GET_STATUS REQ Client
16 ECHO_REQ REQ Client/Worker
17 ECHO_RES RES Client/Worker
18 SUBMIT_JOB_BG REQ Client
19 ERROR RES Client/Worker
20 STATUS_RES RES Client
21 SUBMIT_JOB_HIGH REQ Client
22 SET_CLIENT_ID REQ Worker
23 CAN_DO_TIMEOUT REQ Worker
24 ALL_YOURS REQ Worker
25 WORK_EXCEPTION REQ Worker
RES Client
26 OPTION_REQ REQ Client/Worker
27 OPTION_RES RES Client/Worker
28 WORK_DATA REQ Worker
RES Client
29 WORK_WARNING REQ Worker
RES Client
30 GRAB_JOB_UNIQ REQ Worker
31 JOB_ASSIGN_UNIQ RES Worker
32 SUBMIT_JOB_HIGH_BG REQ Client
33 SUBMIT_JOB_LOW REQ Client
34 SUBMIT_JOB_LOW_BG REQ Client
35 SUBMIT_JOB_SCHED REQ Client
36 SUBMIT_JOB_EPOCH REQ Client
4 byte size - A big-endian (network-order) integer containing
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论