Gearman-任务分发系统

简介

Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相比,Gearman更偏向于任务分发功能。

Gearman提供了一个通用的应用程序,可以工作在更加适合处理这项任务的其他计算机或其他处理器上。它允许并行处理,载入平衡处理,而且可以在不同语言间进行调用。它可以应用于各种各样的应用场合。

Gearman最初用于LiveJournal的图片resize功能,由于图片resize需要消耗大量计算资 源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。

优点

以下是关于Gearman的一些优点:

  • 开源:完全开源,免费的。
  • 多语言:有许多语言接口,而且支持的语言数量一直在增加。
  • 灵活:不依赖于任何特定的设计。
  • 快速:简单的协议和接口,可以减少现有应用程序的开销。
  • 嵌入:轻量,可以以最小的代价引入到现有程序。
  • 没有单点故障:具有较强的容错性。

工作原理

Gearman-任务分发系统_第1张图片
Gearman Client:负责发起任务请求,创建Job
Gearman Job Server:负责任务调度,负责把来自Client的Job分发到不同服务器或不同处理器上的Worker。
Gearman Worker:负责Job处理,并通过Job Server返回结果给Client。

Worker工作流程

  1. Worker通过CAN_DO消息,注册到Job server上。
  2. 随后发起GRAB_JOB,主动要求分派任务。
  3. Job server如果没有job可分配,就返回NO_JOB。
  4. Worker收到NO_JOB后,进入空闲状态,并给Job server返回PRE_SLEEP消息,告诉Job server:”如果有工作来的话,用NOOP请求我先。”
  5. Job server收到worker的PRE_SLEEP消息后,明白了发送这条消息的worker已经进入了空闲态。
  6. 这时如果有job提交上来,Job server会给worker先发一个NOOP消息。
  7. Worker收到NOOP消息后,发送GRAB_JOB向Job server请求任务。
  8.  Job server把工作派发给worker。
  9. Worker干活,完事后返回WORK_COMPLETE给Job server。

处理时序图

同步

Gearman-任务分发系统_第2张图片

异步

Gearman-任务分发系统_第3张图片

集群

Gearman-任务分发系统_第4张图片

如果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刚才正在执行的工作)
  • 负载均衡
job server并不主动分派工作任务,而是由worker从空闲状态唤醒之后到job server主动抓取工作任务。
  • 可扩展
松耦合的接口和无状态的job,只需要启动一个worker,注册到Job server集群即可。新加入的worker不会对现有系统有任何的影响。
  • 分布式
gearman是分布式的任务分发框架,worker与job server,client与job server通信基于tcp的socket连接。
gearman内置内存队列,默认情况队列最大容量为300W,可以配置最大支持2^32-1,即4 294 967 295。
  • 高性能
作为Gearman的核心,Job server的是用C/C++实现的,由于只是做简单的任务派发,因此系统的瓶颈不会出在Job server上。

使用场景

  • 长时间运行的处理:图片处理,订单处理,批量邮件/通知 ...
  • 要求高CPU或内存的处理:大容量的数据处理,MapReduce运算,日志聚集,视频编码
  • 分布式和并行的处理
  • 定时处理:增量更新,数据复制
  • 限制速率的FIFO处理

实例-python

Client-单任务

在没有worker启动的情况下,client并不会结束,会阻塞直到worker处理完job。
Gearman-任务分发系统_第5张图片

Client-多任务

同步非阻塞方式发送多个job的例子,在取得server返回结果之前,用了wait_until_jobs_completed函数来等待task中的所有job返回结果。
Gearman-任务分发系统_第6张图片

Worker

对worker而言,则会一直阻塞直到有新的job到来。
Gearman-任务分发系统_第7张图片

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

Gearman-任务分发系统_第8张图片

你可能感兴趣的:(其他,gearman,开源,任务调度,并行处理,server)