国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Gearman的安裝和使用

U2FsdGVkX1x / 2657人閱讀

摘要:啟動和如下信息則表示成功查看版本安裝擴(kuò)展從下載最新擴(kuò)展需下載最新源碼包,并解壓縮安裝安裝成功后信息然后,配置文件增加內(nèi)容重啟后,出現(xiàn)如下信息則表示安裝擴(kuò)展成功。

首發(fā)于 樊浩柏科學(xué)院

Gearman 是一個分布式任務(wù)分發(fā)系統(tǒng),通過程序調(diào)用(API,跨語言)分布式地把工作委派給更適合做某項(xiàng)工作的機(jī)器,且這些機(jī)器可以以并發(fā)的、負(fù)載均衡的形式來共同完成某項(xiàng)工作。當(dāng)計(jì)算密集型場景時,適合在后臺使用 Gearman 異步地運(yùn)行工作任務(wù)。

認(rèn)識Gearman

Gearman 只是一個分布式程序調(diào)用框架,其主要由三部分組成,并通過暴露給使用方的 API 來完成任務(wù)委派和執(zhí)行。

組成角色

Gearman 中存在三個重要的角色,分別為 Client、Job Server、Worker。

Client:任務(wù)的發(fā)起者(可以是 C、PHP、Java、Perl、MySQL 等);

Job Server:任務(wù)調(diào)度者,負(fù)責(zé)將 Client 委派的任務(wù)轉(zhuǎn)發(fā)給相應(yīng)的 Worker(gearmand 進(jìn)程管理);

Worker:任務(wù)的實(shí)際執(zhí)行者(可以是 C、PHP、Java、Perl 等);

Client、Job Server、Worker 典型的部署方案,如下圖:

那么,Gearman 是如何利用這三者進(jìn)行任務(wù)的調(diào)度呢?

可以看出,在實(shí)際使用時,我們只需調(diào)用 Gearman 已經(jīng)實(shí)現(xiàn)了 Client 和 Worker 的 API,委派和注冊執(zhí)行的任務(wù),而無需關(guān)心任務(wù)的分發(fā)和機(jī)器的負(fù)載均衡問題。

外部API

到目前為止,Gearman 已經(jīng)提供了 C、Shell、Prel、 Nodejs、PHP、Python、Java、C#、Go、MySQL 等版本的 Client、Worker API,詳細(xì)信息見 這里。本文只以 PHP 版為例,列舉 Gearman 常用的 API 。

Client 端常用 API 列表:

功能描述 方法(GearmanClient 類中)
注冊一個 Client addServer(),單個
addServers(),多個
發(fā)起 Job 任務(wù) doNormal(),阻塞會等待
doBackground(),非阻塞
doLow(),低優(yōu)先級任務(wù)
doHigh(),高優(yōu)先級任務(wù)
添加 Tash(一組 Job) addTask()、addTaskBackground()
addTaskHigh()、addTaskHighBackground()
addTaskLow()、addTaskLowBackground()
發(fā)起 Tash 任務(wù) runTasks()
獲取最新操作的結(jié)果 returnCode()
注冊事件回調(diào) setCompleteCallback()、setFailCallback()
說明:Job 是單個任務(wù),每個任務(wù)只會在一個 Worker 上執(zhí)行,而 Task 是一組 Job,其多個子任務(wù)會分配到多個 Worker 上并行執(zhí)行。

Worker 端常用 API 列表:

功能描述 方法(GearmanWorker 類中)
注冊一個 Worker addServer(),單個
addServers(),多個
注冊處理任務(wù)回調(diào) addFunction()
等待和執(zhí)行任務(wù) work()
獲取最新操作的結(jié)果 returnCode()

Job 端也提供了 API,其常用列表為:

功能描述 方法(GearmanJob 類中)
獲取任務(wù)攜帶的序列化數(shù)據(jù) workload()
workloadSize(),獲取數(shù)據(jù)大小
向運(yùn)行的任務(wù)發(fā)送數(shù)據(jù) sendData()
說明:Gearman 各端之間數(shù)據(jù)交互時,數(shù)據(jù)需要進(jìn)行序列化處理。
安裝Gearman

本文安裝 Gearman 需要兩步,第一步安裝守護(hù)程序(gearmand)的 Job,第二步安裝 PHP 擴(kuò)展。

安裝gearmand

首先,下載 Gearman 守護(hù)程序 gearmand 的 最新源碼,并解壓縮源碼包:

cd /usr/src
$ wget https://github.com/gearman/gearmand/releases/download/1.1.17/gearmand-1.1.17.tar.gz
$ tar zxvf gearmand-1.1.17.tar.gz

接著,安裝 gearmand 的依賴包,并編譯源碼安裝 gearmand:

$ yum install boost-devel gperf libuuid-devel libevent-devel
$ cd ./gearmand-1.1.17.tar.gz
$ ./configure
$ make && make install
# 安裝成功信息
Libraries have been installed in:
   /usr/local/lib
   - have your system administrator add LIBDIR to "/etc/ld.so.conf"

修改/etc/ld.so.conf配置文件,添加 MySQL 動態(tài)鏈接庫地址:

# /usr/local/mysql/lib為MySQL動態(tài)鏈接庫libmysqlclient.so的目錄
$ echo "/usr/local/mysql/lib" >>/etc/ld.so.conf
# 使其生效
$ /sbin/ldconfig

然后,如果出現(xiàn)如下信息則表示安裝 gearmand 成功。

# 啟動Client和Worker
$ gearman
# 如下信息則表示成功
gearman    Error in usage(No Functions were provided).
Client mode: gearman [options] []

# 查看gearmand版本
$ gearmand -V
gearmand 1.1.17
安裝PHP擴(kuò)展

從 PECL 下載最新 gearman 擴(kuò)展(php7 需下載 最新源碼包),并解壓縮安裝:

$ cd /usr/src
$ wget http://pecl.php.net/get/gearman-1.1.2.tgz
$ tar zxvf gearman-1.1.2.tgz
$ cd gearman-1.1.2
$ /usr/local/php/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
# 安裝成功后信息
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

然后,配置 php.ini 文件:

$ php --ini
Loaded Configuration File:         /usr/local/php/lib/php.ini
$ vim /usr/local/php/lib/php.ini
#增加內(nèi)容
extension=gearman.so

重啟 php-fpm 后,出現(xiàn)如下信息則表示安裝擴(kuò)展成功。

$ php --info | grep "gearman"
gearman support => enabled
libgearman version => 1.1.17
運(yùn)行Gearman

運(yùn)行 Gearman ,實(shí)際上我們需要使用到 Client、 Job、Worker 這三個角色。gearman 端實(shí)現(xiàn)了 Client 和 Worker 角色的功能 ,使用 PHP 時以擴(kuò)展形式存在,gearmand 端則實(shí)現(xiàn)了 Job 角色的功能。

啟動Job
# 先創(chuàng)建日志目錄
$ gearmand -d --log-file=/var/log/gearmand.log
如果啟動時出現(xiàn) Address family not supported by protocol 錯誤,需要增加-L 0.0.0.0參數(shù)。

查看啟動信息:

$ ps -ef | grep gearman
root     6048     1  0 19:56 ?        00:00:00 gearmand -d
# 監(jiān)聽端口
$ netstat -tunpl | grep "gearmand"
tcp  0  0 0.0.0.0:4730  0.0.0.0:*   LISTEN  6048/gearmand

gearmand 命令的一些參數(shù)說明:

-b –backlog:監(jiān)聽連接數(shù)量

-d –daemon:后臺運(yùn)行

-f –file-descriptors:文件描述符的數(shù)量

-j –job-retries:移除不可用 Job 之前運(yùn)行的次數(shù)

-l –log-file:日志文件存放位置(默認(rèn)記錄最簡單日志)

-L –listen:監(jiān)聽的 IP

-p –port:指定監(jiān)聽端口

-q –queue-type:指定持久化隊(duì)列

-t –threads:使用的 I/O 線程數(shù)量

-u –user:啟動后,切換到指定用戶

--mysql-host:--mysql 系列為 MySQL 持久化連接信息

為了方便管理 gearmand,可以將 gearmand 注冊為一個 service 服務(wù)。
啟動Client和Worker

通過 gearman 命令啟動 Client 和 Worker 并不是必須的,這里僅僅是為了在命令行下測試工具。

首先,啟動一個 Worker,用于列出某個目錄的內(nèi)容:

$ gearman -w -f ls -- ls -lh

然后,創(chuàng)建一個 Client,用于查找請求的一個作業(yè):

$ gearman -f ls < /dev/null
total 4.0K
drwxr-xr-x. 21 www www 4.0K Jun 21 23:52 www
PHP使用Gearman

當(dāng)啟動 Job 服務(wù)后,PHP 就可以通過 Gearman 擴(kuò)展,創(chuàng)建任務(wù)和綁定任務(wù)處理回調(diào)了。PHP 調(diào)用 Gearman 的 API 見 外部 API 部分,更多官方示例見 這里。

同步

Client 工作在同步阻塞模式,Client 發(fā)起任務(wù)后會等待至 Worker 執(zhí)行任務(wù)結(jié)束。

Client 端

//Client.php
$client= new GearmanClient();
$client->addServer();

$msg = "Hello World!";
echo "Sending?$msg
";
echo "Success: ", $client->doNormal("reverse", $msg), "
";

Worker 端

//Worker.php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "reverse_fn");
echo "Waiting?for?job...
";
while ($worker->work());

function reverse_fn($job) {
    $workload = $job->workload();
    echo "Workload:?$workload
";
    $result = strrev($workload);
    echo "Result: $result
";
    return $result;
}

輸出結(jié)果為:

//Client
Sending?Hello World!
Success: !dlroW olleH

//Worker
Waiting?for?job...
Workload:?Hello World!
Result: !dlroW olleH

三端的交互流程圖,如下:

異步

異步方式時,Client 端不會產(chǎn)生 IO 阻塞,能實(shí)現(xiàn)異步執(zhí)行,在實(shí)際應(yīng)用中可以結(jié)合 fastcgi_finish_request() 函數(shù)或者 MQ 來異步使用。

Client 端

$client= new GearmanClient();
$client->addServer();
$client->setDataCallback("reverse_data");

$msg = "Hello World!";
echo "Sending?$msg
";
$task = $client->addTaskBackground("reverse", $msg);
$msg = "I am Gearman!";
echo "Sending?$msg
";
$task = $client->addTaskBackground("reverse", $msg);
$client->runTasks();

function reverse_data($task) {
    echo "Data: " . $task->data() . "
";
}

Worker 端

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", "reverse_fn");
echo "Waiting?for?job...
";
while ($worker->work());

function reverse_fn($job)
{
    $workload = $job->workload();
    echo "Workload:?$workload
";
    $result = strrev($workload);
    $job->sendData($result);
    echo "Result: $result
";
    return $result;
}

輸出結(jié)果為:

//Client
Sending?Hello World!
Data: !dlroW olleH
//Worker1
Waiting?for?job...
Workload:?Hello World!
Result: !dlroW olleH
//Worker2
Waiting?for?job...
Workload:?I am Gearman!
Result: !namraeG ma I
Gearman的管理工具

Gearman 可以使用 GearmanManager 作為管理工具,命令行下可以使用 gearadmin 命令來進(jìn)行簡易的管理。

$ gearadmin --show-jobs
32 ::7866:86a6:d87f:0%32 - : reserve

$ gearadmin --show-jobs
H:fhb:79    0    1    0
H:fhb:86    0    1    0

$ gearadmin --status
reverse    1    0    0
ls        0    0    0
總結(jié)

雖然 Gearman 出現(xiàn)的比較早,但是其支持跨語言調(diào)用特性,以及負(fù)載均衡的方式委派任務(wù),在分布式系統(tǒng)下,可以更加合理高效地利用系統(tǒng)資源。在一些大型的密集型、異步后臺系統(tǒng)也已有成功部署的案例(數(shù)據(jù)抓取,庫存數(shù)據(jù)更新、郵件和短信服務(wù)等),另 PHP 借助 Gearman 也能實(shí)現(xiàn)多任務(wù)處理方案。

推薦:用 Gearman 分發(fā) PHP 應(yīng)用程序的工作負(fù)載

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29791.html

相關(guān)文章

  • JAVA通過Gearman實(shí)現(xiàn)MySQL到Redis數(shù)據(jù)同步(異步復(fù)制)

    摘要:但是這需要對文件以及有非常深入的理解,同時由于存在多種形式,分析實(shí)現(xiàn)同步的工作量是非常大的。因此這里選擇了一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的,將數(shù)據(jù)首先放入中,然后通過一個自己編寫的,將數(shù)據(jù)同步到。此類連接遠(yuǎn)程的。 MySQL到Redis數(shù)據(jù)復(fù)制方案 無論MySQL還是Redis,自身都帶有數(shù)據(jù)同步的機(jī)制,像比較常用的 MySQL的Master/Slave模式 ,就是由Sl...

    doodlewind 評論0 收藏0
  • 利用 Gearman 實(shí)現(xiàn)系統(tǒng)錯誤報警功能

    摘要:文件分發(fā)針對用戶上傳的文件,進(jìn)行多臺服務(wù)器分發(fā)。系統(tǒng)報警當(dāng)系統(tǒng)出現(xiàn)問題的時候,第一時間通知相關(guān)人。這篇文章主要講解系統(tǒng)報警場景在開發(fā)系統(tǒng)的過程中,往往程序會出現(xiàn)這樣,那樣的問題。所以,使用實(shí)現(xiàn)短信,郵件的異步發(fā)送。也可以用來實(shí)現(xiàn)上面的需求。 Gearman 是什么? Gearman是一個用來把工作委派給其他機(jī)器、分布式的調(diào)用更適合做某項(xiàng)工作的機(jī)器、并發(fā)的做某項(xiàng)工作在多個調(diào)用間做負(fù)載均衡...

    IntMain 評論0 收藏0
  • PHP異步操作(swoole, gearman)

    摘要:異步操作廢話不說直接進(jìn)入正題應(yīng)用場景業(yè)務(wù)邏輯中經(jīng)常會出現(xiàn)發(fā)送信息發(fā)送郵件記錄日志等等這個時候用異步再好不過了用戶直接的體驗(yàn)就是使用的賊流暢使用技術(shù)這個不僅僅支持了其他語言也支持有的擴(kuò)展用起來更方便感覺上異步隊(duì)列不同點(diǎn)有個隊(duì)列專門用來存儲發(fā)送 PHP異步操作 廢話不說直接進(jìn)入正題: 應(yīng)用場景: 業(yè)務(wù)邏輯中經(jīng)常會出現(xiàn)發(fā)送信息,發(fā)送郵件,記錄日志等等,這個時候用異步再好不過...

    Fundebug 評論0 收藏0
  • Gearman 使用小知識

    摘要:目前項(xiàng)目采用的是來實(shí)現(xiàn)異步任務(wù)。關(guān)于介紹通俗的來說是一個分發(fā)任務(wù)的程序框架使用的應(yīng)用通常有三部分組成一個一個一個任務(wù)服務(wù)器。的作用是提出一個任務(wù)交給任務(wù)服務(wù)器。請求的調(diào)度者,用來負(fù)責(zé)協(xié)調(diào)把發(fā)出的請求轉(zhuǎn)發(fā)給合適的。 眾所周知,PHP要實(shí)現(xiàn)異步任務(wù)一般都是通過 Gearman Beanstalkd 等第三方來實(shí)現(xiàn)的。目前項(xiàng)目采用的是 Gearman 來實(shí)現(xiàn)異步任務(wù)。 關(guān)于Gearman介紹...

    ideaa 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<