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小时内删除。