• Gearman 初窥【转载】


     

     

    Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完成。Gearman最初用于LiveJournal的图片 resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行,完成任务之后返回前端再呈现到界面。

    Gearman - PHP网站开发 - 每日最新博客在置顶博客之后

     

    通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用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,可以很方便的实现应用程序的分布式负载均衡架构。

    下面看看如何安装运行一个例子,条件所限,我们把Client,Job,Worker三个角色运行在一台服务器上:

    安装Gearman server and library:

    wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz
    tar zxf gearmand-0.8.tar.gz
    cd gearmand-0.8
    ./configure
    make
    make install

    安装Gearman PHP extension:

    wget http://pecl.php.net/get/gearman-0.4.0.tgz
    tar zxf gearman-0.4.0.tgz
    cd gearman-0.4.0
    phpize
    ./configure
    make
    make install

    编辑php.ini配置文件加载相应模块并使之生效:

    extension = "gearman.so"

    启动Job:

    gearmand -d

    如果当前用户是root的话,则需要这样操作:

    gearmand -d -u root

    缺省会使用4730端口,下面会用到。

    注意:如果找不到gearmand命令的路径,别忘了用whereis gearmand确认。

    编写Worker:

    worker.php文件内容如下:

    <?php
    $worker= new GearmanWorker();
    $worker->addServer('127.0.0.1', 4730);
    $worker->addFunction('reverse', 'my_reverse_function');

    while ($worker->work());

    function my_reverse_function($job)
    {
        return strrev($job->workload());
    }
    ?> 

    设置后台运行work:

    php worker.php &

    编写Client:

    client.php文件内容如下:

    <?php
    $client= new GearmanClient();
    $client->addServer('127.0.0.1', 4730);
    echo $client->do('reverse', 'Hello World!'), " ";
    ?>

    运行client:

    php client.php

    输出:!dlroW olleH

    出 于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你完全可以通过Gearman集成不同语言实现的 Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增加多个Worker即可,你可以按照worker.php的样子 多写几个类似的文件,并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件,并多次使用client.php去请求,你就会发现 Job会把Client请求转发给不同的Worker。

    命令工具

    如果你觉得安装PHP之类的东西太麻烦的话,你也可以仅仅通过命令行工具来体验Gearman的功能:

    启动Worker:gearman -w -f wc -- wc -l &
    运行Client:gearman -f wc < /etc/passwd

    Gearman都能用来干什么
    Gearman 可以用在各个方面,最简单就是在不同语言之间架起一座桥梁。比如你可能希望你的php程序调用一个c 函数,那么用gearman就可以实现了,当然了实际你可以通过写一个php扩展来实现同样的工作,但是比如你要php调用java,perl,或者 python那么,Gearman就非常棒了。

    Gearman另一个应用方面是负载分担,你可以将worker放在不同的服务器(或者一些 列服务器)上,比如你的php程序需要图片转换,但是不希望本地服务器有太多的这样图片转换的进程,那么你可以建立一系列服务器,在上面加载worker 处理图片转换。这样你的web服务器将不受图片转换的影响,同时你得到了负载均衡的功能,因为job server会在请求到来的时候,将这个请求发给空闲的worker.同样对于多核的服务器,你可以在同一机器上创建同样数目的worker. 你可能担心,job server处于一个中心,那么这会是一个单点的瓶颈,如果死了,会怎么样?对于这样的情况,你可以运行多个job server。这样如果一个job server down了,client和worker会自动迁移到另一台job server上。

    Gearman范例在官网可找到:
    slides:
    http://gearman.org/index.php?id=presentations
    use cases:
    http://gearman.org/index.php?id=use_cases

     

    http://blog.163.com/lgh_2002/blog/static/44017526201281394856306/

     http://blog.csdn.net/fdipzone/article/details/7166520

    http://blog.csdn.net/mldxs/article/details/8616931

    http://www.oschina.net/question/234345_42515

    http://hi.baidu.com/billdkj/item/6810fceada157aabc10d752f

     

     

  • 相关阅读:
    【RS】RankMBPR:Rank-Aware Mutual Bayesian Personalized Ranking for Item Recommendation
    【RS】Local Collaborative Ranking
    【RS】List-wise learning to rank with matrix factorization for collaborative filtering
    【RS】Using graded implicit feedback for bayesian personalized ranking
    Pycharm 中添加第三方库和插件
    Debug 路漫漫-05
    Debug 路漫漫-04
    推荐系统 BPR 算法求解过程
    【RS】BPR:Bayesian Personalized Ranking from Implicit Feedback
    推荐系统 SVD和SVD++算法
  • 原文地址:https://www.cnblogs.com/jamesbd/p/3617277.html
Copyright © 2020-2023  润新知