zoukankan      html  css  js  c++  java
  • Gearman分布式任务处理系统

    1,http://blog.csdn.net/jiao_fuyou/article/details/16330195

    Gearman介绍

    Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。

    通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。

    对于分布式网络环境或者有大量任务的应用,我们需要将任务在不同的服务器之间进行分布,这个时候正好是Gearman发挥实力的时候。虽然我们也可以使用MQ队列再加一些自己实现的调度算法来将任务进行分发,但是既然已经有了成熟的产品,为什么不使用下呢。

    Gearman提供了一种通用的程序框架来将你的任务分发到不同的机器或者不同的进程当中。它提供了你进行并行工作的能力、负载均衡处理的能力,以及在不同程序语言之间沟通的能力。Gearman能够应用的领域非常广泛,从高可用的网站到数据库的复制任务。总之,Gearman就是负责分发处理的中枢系统,它的优点包括:
    开源:Gearman免费并且开源而且有一个非常活跃的开源社区,如果你想来做一些贡献,请点击 。
    多语言支持:Gearman支持的语言种类非常丰富。让我们能够用一种语言来编写Worker程序,但是用另外一种语言编写Client程序。
    灵活:不必拘泥于固定的形式。您可以采用你希望的任何形式,例如 Map/Reduce。
    快速:Gearman的协议非常简单,并且有一个用C语言实现的,经过优化的服务器,保证应用的负载在非常低的水平。
    可植入:因为Gearman非常小巧、灵活。因此您可以将他置入到现有的任何系统中。
    没有单点:Gearman不仅可以帮助扩展系统,同样可以避免系统的失败。

    Gearman架构和工作原理

    使用Gearman的应用通常有三部分组成:一个Client、一个Worker、一个任务服务器。 Client的作用是提出一个 Job 任务 交给 Job Server 任务服务器。Job Server 会去寻找一个 合适的 Worker 来完成这项任务。Worker 执行由 Client 发送过来的 Job,并且将结果通过 Job Server 返回给 Client。Gearman 提供了 Client 和 Worker 的 API,利用这些API 应用可以同 Gearman Job Server来进行通信。Gearman 内部 Client 和 Worker 之间的通信都是通过 TCP 连接来进行的。工作的流程如下图所示:

    Client的作用是提出一个 Job 任务 交给 Job Server 任务服务器。Job Server 会去寻找一个 合适的 Worker 来完成这项任务。

    Worker 执行由 Client 发送过来的 Job,并且将结果通过 Job Server 返回给 Client。Gearman 提供了 Client 和 Worker 的 API,利用这些API 应用可以同 Gearman Job Server来进行通信。

    Gearman 内部 Client 和 Worker 之间的通信都是通过 TCP 连接来进行的。工作的流程如下图所示:

     

    简单来讲,就是下面的流程

    1. 启动 Gearman ,监听 7003
    2. 启动 Worker , 注册功能到服务器上.
    3. 启动 Client ,请求注册的功能,并提供输入的数据
    4. Gearman 的服务发送"功能请求"到 Worker.并给 Client 输入的数据传送给 Worker.
    5. Worker 接收到"功能请求"和输入的数据.并处理输入的数据内容.
    6. Worker 返回处理的数据结果,服务转发这个结果给客户端.
    7. Client 客户端接收到处理的结果,并显示结果给用户

    一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。


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


    因为Client,Worker并不限制用一样的语言,所以有利于多语言多系统之间的集成。


    甚至我们通过增加更多的Worker,可以很方便的实现应用程序的分布式负载均衡架构。

    2, 安装Gearman server and library:

    1. #yum install libevent-dev  
    2. #yum install uuid-dev  
    3. #yum install boost-devel* gperf* libevent-devel* libuuid-devel
    4. wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
    5. tar zxvf gearmand…
      cd gearmand …
      ./configure
      make && make install

      安装该扩展需要先安装一些依赖,建议直接默认./configure,不要指定路径等。

       常见问题1:提示找不到boost>=1.39,明明已经安装了,这里应该是没有安装gcc-c++,有的机器有gcc却不一定带有gcc-c++。yum install gcc-c++应该就可以了。

    3, 安装Gearman 的php扩展

      下载扩展程序:http://pecl.php.net/package/gearman

      wget http://pecl.php.net/get/gearman-1.1.2.tgz
      tar zxvf gearman-1….
      cd gearman-1 …
      /usr/local/php/bin/phpize 
      ./configure --with-php-config=/usr/local/php/bin/php-config 
      make && make install

      很快就安装完成,最后会展示so文件的路径,如: /usr/lib64/php/modules/

      在php.ini末尾加上extension=”gearman.so”,重启apache,输出php –info |grep “gearman”或者php -m或者网页输出phpinfo()都能看到已经安装成功。

     4, 简单实例

    client.php

    <?php

    $client= new GearmanClient();
    $client->addServer("127.0.0.1", 4730);

    print $client->do("title", "Linvo12345");
    print "/n";

    ?>

    worker.php

    <?php
    $worker= new GearmanWorker();
    $worker->addServer("127.0.0.1", 4730);
    $worker->addFunction("title", "title_function");
    while (true){
    $worker->work();
    if ($worker->returnCode() != GEARMAN_SUCCESS) {
    //Gearman 状态错误 需要做日志或异常处理
    }
    }
    function title_function($job)
    {
    $str = $job->workload();
    return strlen($str);
    }
    ?>

    准备工作已经完毕,试验开始
    1、启动job
    gearmand -d

    2、启动worker
    php worker.php

    3、启动client(新开终端中打开)
    php client.php

    屏幕显示字符串的长度 “10”

    注意点: 1, worker应该做成守护进程(CLI模式),可以开启多个,这样client发起的任务就会分发到各个worker分别来执行(自动负载均衡 )

          这个例子由于太过简单,即使开启多个worker也无法看出效果,不过可以通过终止其中一个或者添加一个,

          可以看出系统自动切换到其他worker继续正常执行

         2, 同理,client也是可以开启多个的(模型请参考之前的那边日志)

         3, 同时,job也可以开启多个,以避免单点故障

         4 , 日志文件一般在: /usr/local/var/log/gearmand.log

     5, 还可以投递任务

    $client=newGearmanClient();
    $client->addServer();//本机可以直接addServer(),默认服务器端使用4730端口
    $client->addTask('wx_push',json_encode($push_data));//
    $client->runTasks();//运行队列中的任务,只是do系列不需要runTask()。
  • 相关阅读:
    在数据集下建立FeatureClass
    打开对话框保存对话框
    C# 向数据库中添加数据
    OleDbCommand OleDbDataAdapter比较研究素材
    C# 判断数据库是否存在某张表
    AE常见问题、异常处理
    制作停靠窗体、悬浮窗Dockpanel
    11. Container With Most Water(js)
    10. Regular Expression Matching(js)
    9. Palindrome Number(js)
  • 原文地址:https://www.cnblogs.com/maomaochong123/p/8099786.html
Copyright © 2011-2022 走看看