在gearman的官网http://gearman.org/有以下的一段说明

A Gearman powered application consists of three parts: a client, a worker, and a job server.

The client is responsible for creating a job to be run and sending it to a job server.

The job server will find a suitable worker that can run the job and forwards the job on.

The worker performs the work requested by the client and sends a response to the client through the job server.

Gearman由client,worker,jobserver 3的部分组成的.

客户端(client)负责生成一个任务并且将任务发送到jobserver.

任务服务器(jobserver)找到某个能够执行该任务的worker后将该任务发送给他.

工人(worker)执行由jobserver发过来的任务并且将结果通过jobserver,发送回client.

这个是以上的中文翻译.

从这段描述中,发现client和worker是无法直接通信的,换句话说,client根本不知道worker的存在,反过来也是如此.而client和worker两者都只能和jobserver进行通信.

gearman为何要如此设计这3个不同的部件(part)呢? 我们可以通过发生在现实世界的场景来理解.

现实场景:

某个客户c1 需要商品p1,但是他没有能力自己生产该商品p1,所以客户c1只好将生产商品p1的任务(job1)委托给某个生产企业e1来做.

该生产企业e1接受了来自客户c1的生产商品p1的任务job1之后, 将任务job1派发给了能够生产该商品的工人w1.

工人w1接受生产任务job1并开始了生产商品p1的工作.当完成了生产任务job1后,通知生产企业e1,最后生产企业e1将生产好的商品p1给到了客户A.

结论:

1 在整个流程中,客户c1根本不认识生产商品的工人w1(其实也没有认识工人w1的必要),客户c1只和生产企业e1进行联系(发送任务,接受结果)

2 工人w1也不需要知道客户c1是谁.工人只需要知道任务(job)是什么,工人w1也只和生产企业e1进行联系(接受任务,发送结果).

而 gearman的工作流程就是以上过程模拟.

客户c1对应了gearman的client;

生产企业e1对应了gearman的jobserver;

工人w1对应了gearman的worker;

这种设计能够带来很多的好处.

好处1:各司其职,互不干扰,耦合度低

工人w1 只做一件事情,就是生产商品p1. 如果要生产商品p2的话,那么对不起请让专门做商品p2的工人w2来做吧

客户c1 也只做一件事情,就是将生产商品p1的任务委托给生产企业e1,然后从e1拿到生产完成的商品p1.如何生产商品p1的细节(比如说需要多少工人,机器做还是手工做,再外包等等)他不需要关心.

生产企业 也只做一件事情,就是接受生产商品p1的任务委托给能做该任务的工人w1,然后从w1拿到生产完成的商品p1,给到客户c1就可以了.如何生产商品p1的细节他也不需要关心.

好处2: 易扩展

工人w1 和客户c1和生产企业e1,他们两两间的关系好像给人的感觉是都是一对一的.其实不然,完全可以是多对多的关系.

一个工人可以从多个生产企业获取任务,一个生产企业可以给多个工人派发任务, 一个客户可以将任务委托给多个生产企业,同时一个生产企业也可以接受从多个客户来的任务

所以当我们发现负载增加的时候,完全可以通过增加jobsever 和 worker的数量来应对.

好处3:client和worker可以由不同的编程语言实现.不同系统间需要交互的时候,尤其明显.

对Gearman中client,worker,jobserver的理解的更多相关文章

  1. gearman中任务的优先级和返回状态

    gearman中任务的优先级和返回状态 一.任务的优先级 同步阻塞调用,等待返回结果 doLow:最低优先 doNomal:正常优先级 doHigh:最优先执行 异步派发任务,不等待返回结果,返回任务 ...

  2. 【原】Spark中Client源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...

  3. C#中对IDisposable接口的理解

    http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html C#中对IDisposable接口的理解 本人最近接触一个项目,在这个项目里面看到很多类实现了 ...

  4. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  5. [BS-18] 对OC中不可变类的理解

    对OC中不可变类的理解 OC中存在很多不可变的类(如NSString,NSAttributedString,NSArray,NSDictionary,NSSet等),用它们创建的对象存在于堆内存中,但 ...

  6. oracle中 connect by prior 递归算法 -- 理解

    oracle中 connect by prior 递归算法 -- 理解 http://blog.163.com/xxciof/blog/static/7978132720095193113752/  ...

  7. MVC架构中的Repository模式 个人理解

    关于MVC架构中的Repository模式   个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接 ...

  8. 关于MySQL中的自联结的通俗理解

    关于MySQL中的自联结的通俗理解 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有表格的代码都是来自SQL必知 ...

  9. 关于Autosar中的NM模块的理解

    本篇文章主要介绍AutoSar中关于NM模块的理解. 阅读本篇文章希望达到的目的: 1. NM(网络管理)是用来做什么的: 2. AutoSar中网络管理的原理: 3.项目实例介绍 1. NM(网络管 ...

随机推荐

  1. jQuery 简单归纳总结

    jQuery语法是为HTML元素的选取编制的,能够对元素运行某些操作. 基础语法是:$(selector).action() +美元符号定义 jQuery +选择符(selector)"查询 ...

  2. Java GC 概念摘要

    很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...

  3. android 69 SQLite数据库

    package com.itheima.sqlitedatabase; import java.sql.ResultSet; import android.content.Context; impor ...

  4. oracle13 触发器 变量

    触发器   触发器是指隐含的执行的存储过程.当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql块.可以 ...

  5. LabVIEW设计模式系列——功能全局变量

    标准化:1.图标的标准化         2.模式的标准化Operation:Write & Read        3.xx为变量名称,w为write括号中为默认值,r为read       ...

  6. hadoop错误Could not obtain block blk_XXX_YYY from any node:java.io.IOException:No live nodes contain current block

    错误: 10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYY ...

  7. LPC2378-Jlink 能下载程序,但是调试出现各种奇怪问题

    LPC2378-Jlink调试经验 1.Jlink(d版的没有关系)不能下载程序?     把下载速率设置到500Khz及以下的速率. 2.Jlink能在500Khz的速率下载程序,但是不能调试?添加 ...

  8. C#图片处理高级应用(裁剪,缩放,清晰度,水印)

    转自:http://wu-jian.cnblogs.com/ 前言 需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示.随便看一下, ...

  9. Js 的常用方法:页面跳转,Session,类继承

    MyApp.Base = function () { } var basePrototype = MyApp.Base["prototype"]; //对象克隆方法 basePro ...

  10. Android混淆那些事儿

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园:追风917 # Android混淆 Android混淆是Android开发者经常使用的一种用于代码防止被反编译的 ...