gearman杂谈

gearman杂谈转自 http blog chinaunix net uid 20357359 id 1963682 html 从 08 年开始 所谓的云计算开始流行起来 什么分布式计算模型 分布式消息队列 分布式存储系统各种新鲜事物 gearman 从名字上看叫做 齿轮工 就是通过齿轮把不同的组件组合在一起 通常 多语言多系统之间的集成是项目开发中一个比较头疼的问题 一般

转自: http://blog.chinaunix.net/uid-20357359-id-1963682.html

从08年开始,所谓的云计算开始流行起来,什么分布式计算模型、分布式消息队列、分布式存储系统各种新鲜事物。


gearman,从名字上看叫做“齿轮工”,就是通过齿轮把不同的组件组合在一起。通常,多语言多系统之间的集成是项目开发中一个比较头疼的问题。一般会采用RPC风格或者是REST风格的WebService。但是总感觉比较麻烦。gearman就应运而生了,作为一个任务分发架构,它能够轻松的将前端的任务通过Job Server分发给后端的Worker处理。
Gearman请求的处理过程涉及三个角色:Client -> Job Server -> Worker。


Client:请求的发起者,可以是C,PHP,Perl,MySQL UDF等等。
Job Server:请求的调度者,用来负责协调把Client发出的请求转发给合适的Worker。
Worker:请求的处理者,可以是C,PHP,Perl等等。


工作原理图:

gearman杂谈



工作流:

gearman杂谈



因为Client,Worker并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的Worker,可以很方便的实现应用程序的分布式负载均衡架构。

集群架构:

gearman杂谈



关于gearman的分布式任务处理:
1. 其实每一个任务处理的时间并没有降低,相反会稍稍有所增加,主要是数据在网络上传输的一些时间。
2. 前端Client(通常是web服务器)的负载降低了,但是转移到了后端Worker上。
计算不可能凭空消失,只不过从一台机器转移到了另外一台机器。


3. 同步方式的话,前端Client(通常是Web服务器)等待的时间与后端Worker的数量与当前任务数有关。如果任务数量<=Worker数量,前端Client等待的时间约等于一个任务处理的时间。
但是当任务数>=Worker数量时,就会出现某些Client等待的情况,某个Client只有等到一个空闲的Worker,才会将任务交给它进行处理。


设想一下,在任务数<=Worker数量的时候,使用gearman是可以提高响应时间的。如果采用单机话,N个任务还是在一台机器上运行,每个任务需要


现在有N个任务(Client),M个Worker,每个任务执行时间为t。如果不是用gearman的话,需要的时间为N*t,平均等待时间为N*t/2。
如果使用了gearman的话,并且N<=M,需要的时间为t,平均等待时间为t;如果N>M的话,需要的时间为(N/M)*t or (N/M+1)*t。


test.sh
#!/bin/sh
sleep 10
echo “TEST”


开启2个Worker
./gearman -w -f test /home/wangyao/test.sh


开启3个Client:
date;./gearman -f test;date
三个结果分别为:
——————————————–
Wed Mar 17 14:41:31 CST 2010
TEST 
Wed Mar 17 14:41:41 CST 2010
——————————————–
Wed Mar 17 14:41:32 CST 2010
TEST 
Wed Mar 17 14:41:42 CST 2010
——————————————–
Wed Mar 17 14:41:34 CST 2010
TEST 
Wed Mar 17 14:41:51 CST 2010
——————————————–
可以看出前两个Client的任务都用了10s,但是第3个任务却花了17s。主要在于当第3个任务执行的时候,没有空闲的Worker执行任务,必须等到一个Worker空闲下来,最先空闲的Worker要在14:41:41,在这个时刻执行第3个任务,现在已经过去了7s,再需要10s完成任务,因此第3个任务最终用了17s。


4. 异步方式的话,任务交给后端Worker后,前端Client就返回了,这样用户体验比较好。但是,存在任务执行失败或者是任务结果反馈的问题。
一般采用数据库作为存储,将任务执行的状态信息、结果等存入数据库;前端Client定期检查数据库中的结果,再进一步进行操作,是向用户呈现结果还是重新执行任务。


一个应用实例:
Client将log发送到专门的log服务器:
tail -f access_log | gearman -h host -f logger


可能会有多个log服务器,log服务器将接受到的log信息写入到一个文件中:
gearman -w -h host -f logger > log_file


进行分布式grep,需要在每台log服务器设置一个function:
gearman -w host -f logger1 ./dgrep.sh


#!/bin/sh
read pattern
grep $pattern log_file


相应的在其他log服务器上创建logger2,logger3等。


现在,日志已经在日志服务器上了。我们在其他机器上,想对日志进行分布式的grep。只需要作为一个client,调用worker logger1、logger2、logger3等。
gearman -h host -f logger1 -f logger2 -f logger3 KEYWORD 
这就可以可以在所有的机器上grep KEYWORD了。


这种方法不是很灵活,每台机器设置一个func,对上层不透明。


总体来看,gearman适合于那种task数量远远大于worker数量的应用。理论上来看,将计算开销转移到Worker上,从而实现任务的并发执行,表现为client计算负载减轻,用户的等待时间减少。
对Client而言是task,对于Worker而言是job。


后记
gearman的源码还是值得阅读的,对于设计高并发网络程序有些帮助,其中的架构跟我现在项目中用的差不多,但是有一点感觉不错,只有一个维护对应表的逻辑线程,并且尽量减少系统调用。

gearman的消息传递模式是一对一的,不能实现一对多,一个client通过job server最后只能够到达一个worker上。如果需要一对多,需要定义多个worker的function,依次向这些worker进行发送,非常的不方便。这一点就不如ZeroMQ,ZeroMQ支持的模式很多,能够满足各种消息队列需求。




参考:
http://hqlong.com/2010/01/1222.html#more-1222
http://blog.s135.com/dips/
http://oddments.org/notes/GearmanOSCONTutorial2009.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207502.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:44
下一篇 2026年3月19日 下午1:44


相关推荐

  • C 反双曲余弦函数

    C 反双曲余弦函数反双曲余弦函数的定义是 T1 Math Log t Math Sqrt t t 1 1 叉乘 crossproduct 也叫向量的外积 向量积 顾名思义 求下来的结果是一个向量 记这个向量为 c 向量 c 向量 a 向量 b a b sin a b a b 指向量 a 与向量 b 之间的夹角 向量 a b a b

    2026年3月18日
    2
  • 带你深入理解什么叫js闭包

    带你深入理解什么叫js闭包闭包用一句话总结:闭包就是作用域的延伸解释:函数内部的作用域属于局部作用域,导致只有函数内部才可以访问声明的变量。而闭包可以将局部作用域延伸,使其在函数外部也可以访问内部声明的变量等。关于变量的作用域js变量的作用域无非就两种局部变量和全局变量JavaScript在函数内部可以访问全局变量varn=0;//全局变量functionf1(){console.log(n)//0}f1();而在函数内部声明的局部变量,外部无法直接访问functionf1(

    2022年6月18日
    45
  • 留言板的代码_留言板留言大全短句

    留言板的代码_留言板留言大全短句<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metahttp-equiv=”X-UA-Compatible”content=”IE=edge”><metaname=”viewport”content=”width=device-width,initial-scale=1.0″><title>D.

    2022年10月21日
    4
  • 学会用 Mysql show processlist 排查问题

    学会用 Mysql show processlist 排查问题

    2022年2月12日
    46
  • 服务器基础知识_服务器初学者入门

    服务器基础知识_服务器初学者入门定义:从广义上讲,服务器是指网络中能对其它机器提供某些服务的计算机系统(如果一个PC对外提供ftp服务,也可以叫服务器)。从狭义上讲,服务器是专指某些高性能计算机,能通过网络,对外提供服务。相对于普通

    2022年8月1日
    9
  • SPPnet详解

    SPPnet详解RCNN系列:RCNN,SPPNet,FastRCNN,FasterRCNN,R-FCN。作者是何凯明SPPNet出现的原因之前的网络,比如LeNet,AlexNet,ZF,VGG等,它们的输入都是固定大小的,为什么要固定大小呐?原因就在最后连接的全连接层上。全连接层的输入一定是固定大小的。这一点很容易理解,因为全连接层网络就是传统的神经网络,传统的神经网络的输入层必定是固定大小的。而卷积神经网络的conv层的输入并不需要固定大小,那么conv层不用固定大小,FC层的输入又要固定大小,那么在这两

    2022年6月8日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号