利用Gearman,搭建非同步分散式運算平台

來源:互聯網
上載者:User

Gearman的介紹

首頁在http://gearman.org/index.php, 它的主要優點有:
1. 實現了非同步計算。可以將比較耗時的計算分配到分散式運算叢集來減少站台伺服器的壓力和使用者的等待。例如passport裡的郵件發送/頭像上傳裁減/國內外資料分離請求等等。
2. 跨語言,有利於多語言多系統之間的整合。PHP/Perl/Java/C++可以融合在一起,用Perl實現的郵件發送功能PHP也能自由調用,也可以使用Perl調用另一台伺服器上用C++編寫的程式的一個函數。
3. 便於擴充和實現負載平衡。可以通過增加worker的數量來提供更好的效能,在其中一台出現問題的時候能夠由其他的worker來完成任務。
4. 開源
5. 快速: 利用了c最小化的減少了系統開銷。

 

Gearman的安裝配置

1.安裝Gearman server and library:

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

2.安裝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

3.編輯php.ini設定檔載入相應模組並使之生效:

extension = "gearman.so"

4.啟動Job:

gearmand -d

如果目前使用者是root的話,則需要這樣操作:

gearmand -d -u root

預設會使用4730連接埠,下面會用到。

以調試的方式啟動:

gearmand -vv

5.編寫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 &

6.編寫Client:

client.php檔案內容如下:

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

運行client:

php client.php

輸出:!dlroW olleH

  可能遇到的問題 Couldn't find uuid/uuid.h解決辦法:在新立得裡搜尋並安裝uuid-dev。 gearmand: error while loading shared libraries: libgearman.so.1: cannot open shared object file: No such file or directorylibgearman.so一般是在 /usr/local/lib下,看看/etc/ld.so.conf是否包含這個目錄,執行/sbin/ldconfig -v重新整理一下。 Fatal error: Class 'GearmanWorker' not found  是否在cli的php.ini下加入“extension="gearman.so"”這一行配置。 Gearman與Perl

安裝Gearman模組,使用Gearman::Worker和Gearman::Client模組即可。
具體編碼方式可參考cpan。
需要注意的是$client->do_task()方法返回的是一個reference。
下面是例子。worker.pluse Gearman::Worker;<br />my $worker = Gearman::Worker->new;<br />$worker->job_servers('127.0.0.1:4730');<br />$worker->register_function("reverse", /&test);<br />$worker->work while 1;</p><p>sub test {<br />return join(' ', $_[0]->handle, $_[0]->arg, 'world', "/n");<br />}<br />client.pluse Gearman::Client;<br />my $client = Gearman::Client->new;<br />$client->job_servers('127.0.0.1:4730');</p><p># running a single task<br />my $result = $client->do_task("reverse", "hello"); # return a scalar reference<br />print $$result;Gearman非同步模式的實現
在Perl的Gearman::Client模組裡已經實現了非同步方法,採用dispatch_background時client請求不會等待worker的響應就立即返回了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.