Gearman是一个分发任务的程序框架,可以用在各种场合,Gearman更偏向于任务分发功能。它的 任务分布非常
简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资
源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。
Gearman框架中一共有三个角色:
-
Client: 提交任务的人。创建需要被执行的job然后发送给Job Server。
-
Worker: 真正干活的人。向Job Server注册然后从Job Server处拿活干, PHP, Ruby, Java等流行软件进行编写。
-
Job Server:传说中的manager。接收client提交的Job,分发给相应的worker。并能在worker出现异常时重新派发job。
job,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。
值得注意的是,第6步中,Job server会给每个发送过PRE_SLEEP消息的worker都发送NOOP
消息,哪个worker先进入到第7步,即哪个worker发送的GRAB_JOB最先被Job
server收到,那么这个job就被派发到哪个worker。这一点可以在worker端实现时利用起来,以控制任务的派发策略。也就是说,我们可以通
过自定义worker端的请求策略的方式来达到自定义job分派策略的目的。
Gearman的特性
通过Gearman分布式任务分发框架自然而然地便可以搭建一个分布式计算集群,从这点来说把Gearman称作是分布式计算框架也未尝不可,whatever,只要我们理解了原理,叫什么都无所谓啦。
Geraman宣称的有:开源、多语言支持、富有弹性、高效、易于嵌入和无单点失败。开源和多语言支持毋须多言,其他几个特性需要分别说明一下。
Gearman 分布式任务实现原理上只用到2个字段,function name和data。function
name即任务名称,由client传给job server, job server根据function
name选择合适的worker节点来执行。data通常为执行任务所需的自定义的内容,比如简单的做法可以把需要执行的脚本当成data即可(当然要注
意其中的安全防范)。如果有多个worker可以处理同一个function name, 则job
server会自动分配一个。当用于远程监控场景时,我们可以让每个worker注册成不同的业务名称,以达到方便控制每台worker节点的目的。
阅读(473) | 评论(0) | 转发(0) |