Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1528475
  • 博文数量: 164
  • 博客积分: 2993
  • 博客等级: 少校
  • 技术积分: 1718
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 11:42
文章分类

全部博文(164)

文章存档

2014年(1)

2013年(36)

2012年(90)

2011年(37)

分类: 系统运维

2013-10-16 17:09:57

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。
通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
详细的一些信息就去问谷歌大神吧。
Gearman的安装,可能有些麻烦 我一开始用 的CentOS5.4的机器 结果是各种问题啊,后来实在不行了 ,换了6.2的机器来安装。

  1. # wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz
  2. # tar xzvf gearmand-1.1.5.tar.gz
  3. # cd gearmand-1.1.5
  4. # ./configure --prefix=/usr/local/gearmand
  5. # make
  6. # make install

这里如果出现了相关configure的错误(Boost ,uuid,mysql)的话,那么到网上找资料解决就好了,基本上都能解决,没什么难度的。
这样子的话,那么gearmand的服务端就完成了,我们称之为Job Server。
那么我们现在启动它:这里如果出现了相关configure的错误(Boost ,uuid,mysql)的话,那么到网上找资料解决就好了,基本上都能解决,没什么难度的。
这样子的话,那么gearmand的服务端就完成了,我们称之为Job Server。
那么我们现在启动它:
  1. # usr/local/gearmand/sbin/gearmand -d -P /var/run/gearmand.pid -l /var/log/gearmand.log -u root
接下来我们来安装gearmand的php拓展,我们在中找下是可以找到的,如果找不到那么去这里也可以下载到相应的拓展。

  1. # wget http://pecl.php.net/get/gearman-1.1.1.tgz
  2. # tar zxvf gearman-1.1.1.tgz
  3. # cd gearman
  4. # phpize
  5. # ./configure --with-php-config=/usr/local/php/bin/php-config --with-gearman=/usr/local/gearmand
  6. # make
  7. # make install
这里一定要加上–with-gearman参数,不然你又要为这个拓展单独去安装哥libgearmand了,没这个必要,网上有些文章就是这个错误引起的很多问题。
成功之后加入到php的配置文件中。
下面是一个例子:
客户端例子:
  1. <?php
  2. # Create our client object.
  3. $client= new GearmanClient();

  4. # Add default server (localhost).
  5. $client->addServer("localhost", 4730);

  6. echo "Sending job\n";

  7. # Send reverse job
  8. $result = $client->do("reverse", "Hello!");
  9. if ($result)
  10.   echo "Success: $result\n";
  11. ?>
服务器端例子:
  1. <?php
  2. # Create our worker object.
  3. $worker= new GearmanWorker();
  4.  
  5. # Add default server (localhost).
  6. $worker->addServer("localhost", 4730);
  7.  
  8. # Register function "reverse" with the server.
  9. $worker->addFunction("reverse", "reverse_fn");
  10.  
  11. while (1)
  12. {
  13.   print "Waiting for job...\n";
  14.  
  15.   $ret= $worker->work();
  16.   if ($worker->returnCode() != GEARMAN_SUCCESS)
  17.     break;
  18. }
  19.  
  20. # A much simple reverse function
  21. function reverse_fn($job)
  22. {
  23.   $workload= $job->workload();
  24.   echo "Received job: " . $job->handle() . "\n";
  25.   echo "Workload: $workload\n";
  26.   $result= strrev($workload);
  27.   echo "Result: $result\n";
  28.   return $result;
  29. }
  30. ?>
这个例子呢就是将客户端要执行的抛给gearmand的job server,让他去调度一个空闲的worker来执行我当前的这个任务。我们的woker可以有很多个,jobserver也可以有很多个,这样子就起到了负载均衡的作用了。这个东西在某些情况下应该比队列的效应来的更好些。

在实际使用时应该是运行gearmand -d 的 server 一台或者多台. [要装gearmand,运行gearmand];处理worker的机器若干[要装gearmand 及php so.但gearmand不需要运行].下达任务client若干[要装gearmand 及php so.但gearmand不需要运行]. worker 与 client 不会直接通信,都是通过gearmand来调度分发处理的.

阅读(1838) | 评论(0) | 转发(0) |
0

上一篇:python操作excel

下一篇:python遍历文件夹

给主人留下些什么吧!~~