1 Gearman是什么

Gearman Job Server@http://gearman.org/

Gearman 是一个任务分发系统,它提供了一个分发框架,能够分发某类任务到更适合处理这类任务的服务器上去处理。并且,它支持任务并行处理、负载均衡以及多语言调用。它的适用范围很广,从高可用性的网站到透明的数据库复制等。换句话说,它是一个强健的分布式通信处理系统。下面是官网上列举的优点:

  • Open Source - 开源。Gearman 是遵循BSD开源规范的免费程序。
  • Multi-language - 多语言支持。Gearman可以作为多语言通信的接口。你可以用一种语言分发任务给另一种语言处理。比如php通过gearm分发任务给c。
  • Flexible - 灵活性。使用它,不会让你必须遵循任何特定的设计模式。对于分布式的程序,你可以使用任何你想用的模式,比如Map/Reduce。
  • Fast - 迅猛。Gearman 使用非常简单的协议和接口,它是用C/C++实现的。
  • Embeddable - 易用性。又快又轻量,所以它适用于所有规模的程序。只需要做很小的改动,就可将其整合入已存在的功能中。
  • No single point of failure - 无单点故障。
  • No limits on message size - 通信消息大小无限。单个通信消息最大达4G。要是还不满足,gearman可以将消息分片传输。
  • Worried about scaling? - Don't worry about it with Gearman. Craig's List, Tumblr, Yelp, Etsy,… discover what others have known for years.

2 Gearman如何工作

使用Gearman的程序通常包含三个部分:Client,Worker和Job server。Client是负责创建任务并将其发送至Job server。Job server会选择一个合适的Worker,然后分发来处理这个任务。Worker负责处理任务并返回处理结果。Gearman系统提供了Client和Worker工作部分的API,使得客户端可通过它们与Job server交互。所以你不需要处理网络连接或者分发任务的工作。内部实现上,Client和Worker通过TCP socket与Job server通信。

了解更多的话,让我们先看一个例子:

这个例子将从Client端发送一个字符串至Job Server,而Worker会负责将字符串翻转并返回。

Client端代码:

<?php
# Reverse Client Code
$client= new GearmanClient();
$client->addServer();
print $client->do("reverse", "Hello World!");

这段代码很简单,new个对象,添加Job Server(默认为本地服务器),然后调用reverse功能并打印返回结果。

Worker端代码:

<?php
# Reverse Worker Code
$worker= new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "my_reverse_function");
while ($worker->work()); function my_reverse_function($job)
{
return strrev($job->workload());
}

这段代码也显而易见地吐血。也可知道Gearman用起来是多么简单。

自己实现一个功能,通过GearmanWorker::addFunction注册,并用work()来实现监听数据即可。

整个功能的流程就是这样的:

正如你所见,Gearman实现了任务管理以及网络通信,你只需要关注业务逻辑功能。你还可以创建后台任务以及优先级任务队列。更多内容可以参考Gearman文档

3 Gearman用在什么地方

上面的例子好像费力不讨好,N行代码只出来一个“Hello World!”——还是倒着的。但是Gearman其实在很多情况很实用。

最简单的一种是,你可以使用Gearman作为不同程序语言之间的粘合剂。比如你希望你的php程序调用c的功能,那么php可以作为Client,c来提供Worker的处理功能,Job server和php/c API就可以作为中间的接口。当然你可以把c做成php的扩展,但是你还有可能想使用php Client 和 python Worker,或者mysql Client 和 perl Worker。你可以混合使用任意支持的语言。

另外一种情况是很容易实现Worker的分布式。比如php web程序需要处理图片的转换。这个转换是很耗cpu的,直接在php中做会影响web服务器的QPS。这个时候可以将图片的处理功能放到另外一组cpu强悍的机器上,从而实现物以至用。同时,Gearman也实现了Worker的负载均衡,新任务只会分发到空闲的机器上。

现在你可能会关心Job Server如果宕了怎么办。答案是可以启动2-3台Job Server。如果其中一台无法正常工作了,请求将自动转移动另外可用的Job Server。

4 举个栗子

任务分发系统gearman的更多相关文章

  1. 使用 expect 命令执行自动分发系统

    一.命令 except 实例详解 1. 介绍 expect 使用场景 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动 ...

  2. 基于BT协议的文件分发系统

    基于BT协议的文件分发系统构成:    1.一个Web服务器:保存着种子文件    2.一个种子文件:保存共享文件的一些信息(文件名,文件大小    ,Tracker服务器地址,torrent为后缀) ...

  3. Django之路由分发系统

    web的基本工作流程 首先,我们先来思考一下我们平常在上网浏览网页时候的场景,大致就是打开一个web浏览器,输入某一个网站的地址,然后转到该网址,在浏览器中得到该网址的页面.从这个场景中我们可以抽象出 ...

  4. 关于LT分发系统的设计构想

    git地址 https://github.com/cxyxd/LtDistribution 背景 对tomcat做集群,在多机多tomcat的情况下,如果要更新代码,只能手动的将代码复制,粘贴,然后下 ...

  5. 深度解读阿里巴巴云原生镜像分发系统 Dragonfly

    Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题.随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并通过 ...

  6. expect脚本同步文件 expect脚本指定host和要同步的文件 构建文件分发系统 批量远程执行命令

    自动同步文件 #!/usr/bin/expect set " spawn rsync -av root@.txt /tmp/ expect { "yes/no" { se ...

  7. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  8. 第四部分shell编程5项目二分发系统

    第一部分:expect讲解expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我 ...

  9. shell项目-分发系统-expect讲解

    shell项目-分发系统-expect讲解 yum install -y expect 1. 自动远程登录 #! /usr/bin/expect set host "192.168.133. ...

随机推荐

  1. 安卓自动化测试工具MonkeyRunner之使用ID进行参数化,以及List选择某项和弹出框点击确定的写法

    一.List选择某项的操作步骤: 1.通过父结点得出列表各子项 2.将选择项的文本与列表中的子项进行比较 3.计算出选择项的坐标位置 截取实例: from com.android.monkeyrunn ...

  2. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  3. UVa 116 (多段图的最短路) Unidirectional TSP

    题意: 有一个m行n列的正整数环形矩阵(即矩阵第一行的上一行是最后一行,最后一行的下一行是第一行),从第一列的任意位置出发,每次只能向右,右上,右下三个方向行走,输出路径及路径上所有数之和的最大值,多 ...

  4. 【C#学习笔记】smtp发邮件

    using System; using System.Net; using System.Net.Mail; using System.Text; namespace ConsoleApplicati ...

  5. 【MySQL for Mac】终极解决——MySQL在Mac的字符集设置

    这个问题烦恼一天了,现在终于得以解决.分享给大家 首先贴出来,亲测不可行的博客连接: http://www.2cto.com/database/201305/215563.html http://bl ...

  6. 写的cursor demo仅作记录

    declare @objectID int; declare objcur cursor for object_id from m_object open objcur fetch next from ...

  7. Delphi 让自己的软件实现双击打开文件 转

    unit shjAssociateFileType; interface uses Windows, Registry; {将文件类型strFileExtension与程序strExeFileName ...

  8. NEUOJ711 异星工厂 字典树+贪心

    题意:你可以收集两个不相交区间的权值,区间权值是区间异或,问这两个权值和最大是多少 分析:很多有关异或求最大的题都是利用01字典树进行贪心,做这个题的时候我都忘了...最后是看别人代码的时候才想起来这 ...

  9. 提高Web页面性能的技巧

    现在动辄几兆大小的页面加载量,让性能优化成了不可避免的热门话题.WEB 应用越流畅,用户体验就会越好,继而带来更多的访问量.这也就是说,我们应该反省一下那些过度美化的 CSS3 动画和多重操作的 DO ...

  10. 在Ubuntu6.06 在搭建SVN服务器及在windows建立svn+ssh客户端

    部门现在使用的Linux系统是Ubuntu6.06,内核版本为2.6.15-57-386.由于系统比较老,所有用网上介绍的方法搭建SVN服务器经常出错,所以参考文章[1],将自己的搭建过程记录下. 1 ...