摘要:?jiǎn)?dòng)和如下信息則表示成功查看版本安裝擴(kuò)展從下載最新擴(kuò)展需下載最新源碼包,并解壓縮安裝安裝成功后信息然后,配置文件增加內(nèi)容重啟后,出現(xiàn)如下信息則表示安裝擴(kuò)展成功。
首發(fā)于 樊浩柏科學(xué)院
Gearman 是一個(gè)分布式任務(wù)分發(fā)系統(tǒng),通過程序調(diào)用(API,跨語言)分布式地把工作委派給更適合做某項(xiàng)工作的機(jī)器,且這些機(jī)器可以以并發(fā)的、負(fù)載均衡的形式來共同完成某項(xiàng)工作。當(dāng)計(jì)算密集型場(chǎng)景時(shí),適合在后臺(tái)使用 Gearman 異步地運(yùn)行工作任務(wù)。
認(rèn)識(shí)GearmanGearman 只是一個(gè)分布式程序調(diào)用框架,其主要由三部分組成,并通過暴露給使用方的 API 來完成任務(wù)委派和執(zhí)行。
組成角色Gearman 中存在三個(gè)重要的角色,分別為 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í)際使用時(shí),我們只需調(diào)用 Gearman 已經(jīng)實(shí)現(xiàn)了 Client 和 Worker 的 API,委派和注冊(cè)執(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 類中) |
---|---|
注冊(cè)一個(gè) Client | addServer(),單個(gè) addServers(),多個(gè) |
發(fā)起 Job 任務(wù) | doNormal(),阻塞會(huì)等待 doBackground(),非阻塞 doLow(),低優(yōu)先級(jí)任務(wù) doHigh(),高優(yōu)先級(jí)任務(wù) |
添加 Tash(一組 Job) | addTask()、addTaskBackground() addTaskHigh()、addTaskHighBackground() addTaskLow()、addTaskLowBackground() |
發(fā)起 Tash 任務(wù) | runTasks() |
獲取最新操作的結(jié)果 | returnCode() |
注冊(cè)事件回調(diào) | setCompleteCallback()、setFailCallback() |
說明:Job 是單個(gè)任務(wù),每個(gè)任務(wù)只會(huì)在一個(gè) Worker 上執(zhí)行,而 Task 是一組 Job,其多個(gè)子任務(wù)會(huì)分配到多個(gè) Worker 上并行執(zhí)行。
Worker 端常用 API 列表:
功能描述 | 方法(GearmanWorker 類中) |
---|---|
注冊(cè)一個(gè) Worker | addServer(),單個(gè) addServers(),多個(gè) |
注冊(cè)處理任務(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í),數(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 動(dòng)態(tài)鏈接庫地址:
# /usr/local/mysql/lib為MySQL動(dòng)態(tài)鏈接庫libmysqlclient.so的目錄 $ echo "/usr/local/mysql/lib" >>/etc/ld.so.conf # 使其生效 $ /sbin/ldconfig
然后,如果出現(xiàn)如下信息則表示安裝 gearmand 成功。
# 啟動(dòng)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 這三個(gè)角色。gearman 端實(shí)現(xiàn)了 Client 和 Worker 角色的功能 ,使用 PHP 時(shí)以擴(kuò)展形式存在,gearmand 端則實(shí)現(xiàn)了 Job 角色的功能。
啟動(dòng)Job# 先創(chuàng)建日志目錄 $ gearmand -d --log-file=/var/log/gearmand.log
如果啟動(dòng)時(shí)出現(xiàn) Address family not supported by protocol 錯(cuò)誤,需要增加-L 0.0.0.0參數(shù)。
查看啟動(dòng)信息:
$ 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:后臺(tái)運(yùn)行
-f –file-descriptors:文件描述符的數(shù)量
-j –job-retries:移除不可用 Job 之前運(yùn)行的次數(shù)
-l –log-file:日志文件存放位置(默認(rèn)記錄最簡(jiǎn)單日志)
-L –listen:監(jiān)聽的 IP
-p –port:指定監(jiān)聽端口
-q –queue-type:指定持久化隊(duì)列
-t –threads:使用的 I/O 線程數(shù)量
-u –user:?jiǎn)?dòng)后,切換到指定用戶
--mysql-host:--mysql 系列為 MySQL 持久化連接信息
為了方便管理 gearmand,可以將 gearmand 注冊(cè)為一個(gè) service 服務(wù)。啟動(dòng)Client和Worker
通過 gearman 命令啟動(dòng) Client 和 Worker 并不是必須的,這里僅僅是為了在命令行下測(cè)試工具。
首先,啟動(dòng)一個(gè) Worker,用于列出某個(gè)目錄的內(nèi)容:
$ gearman -w -f ls -- ls -lh
然后,創(chuàng)建一個(gè) Client,用于查找請(qǐng)求的一個(gè)作業(yè):
$ gearman -f ls < /dev/null total 4.0K drwxr-xr-x. 21 www www 4.0K Jun 21 23:52 wwwPHP使用Gearman
當(dāng)啟動(dòng) Job 服務(wù)后,PHP 就可以通過 Gearman 擴(kuò)展,創(chuàng)建任務(wù)和綁定任務(wù)處理回調(diào)了。PHP 調(diào)用 Gearman 的 API 見 外部 API 部分,更多官方示例見 這里。
同步Client 工作在同步阻塞模式,Client 發(fā)起任務(wù)后會(huì)等待至 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
三端的交互流程圖,如下:
異步異步方式時(shí),Client 端不會(huì)產(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 IGearman的管理工具
Gearman 可以使用 GearmanManager 作為管理工具,命令行下可以使用 gearadmin 命令來進(jìn)行簡(jiǎ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ái)系統(tǒng)也已有成功部署的案例(數(shù)據(jù)抓取,庫存數(shù)據(jù)更新、郵件和短信服務(wù)等),另 PHP 借助 Gearman 也能實(shí)現(xiàn)多任務(wù)處理方案。
推薦:用 Gearman 分發(fā) PHP 應(yīng)用程序的工作負(fù)載
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/29791.html
摘要:但是這需要對(duì)文件以及有非常深入的理解,同時(shí)由于存在多種形式,分析實(shí)現(xiàn)同步的工作量是非常大的。因此這里選擇了一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的,將數(shù)據(jù)首先放入中,然后通過一個(gè)自己編寫的,將數(shù)據(jù)同步到。此類連接遠(yuǎn)程的。 MySQL到Redis數(shù)據(jù)復(fù)制方案 無論MySQL還是Redis,自身都帶有數(shù)據(jù)同步的機(jī)制,像比較常用的 MySQL的Master/Slave模式 ,就是由Sl...
摘要:文件分發(fā)針對(duì)用戶上傳的文件,進(jìn)行多臺(tái)服務(wù)器分發(fā)。系統(tǒng)報(bào)警當(dāng)系統(tǒng)出現(xiàn)問題的時(shí)候,第一時(shí)間通知相關(guān)人。這篇文章主要講解系統(tǒng)報(bào)警場(chǎng)景在開發(fā)系統(tǒng)的過程中,往往程序會(huì)出現(xiàn)這樣,那樣的問題。所以,使用實(shí)現(xiàn)短信,郵件的異步發(fā)送。也可以用來實(shí)現(xiàn)上面的需求。 Gearman 是什么? Gearman是一個(gè)用來把工作委派給其他機(jī)器、分布式的調(diào)用更適合做某項(xiàng)工作的機(jī)器、并發(fā)的做某項(xiàng)工作在多個(gè)調(diào)用間做負(fù)載均衡...
摘要:異步操作廢話不說直接進(jìn)入正題應(yīng)用場(chǎng)景業(yè)務(wù)邏輯中經(jīng)常會(huì)出現(xiàn)發(fā)送信息發(fā)送郵件記錄日志等等這個(gè)時(shí)候用異步再好不過了用戶直接的體驗(yàn)就是使用的賊流暢使用技術(shù)這個(gè)不僅僅支持了其他語言也支持有的擴(kuò)展用起來更方便感覺上異步隊(duì)列不同點(diǎn)有個(gè)隊(duì)列專門用來存儲(chǔ)發(fā)送 PHP異步操作 廢話不說直接進(jìn)入正題: 應(yīng)用場(chǎng)景: 業(yè)務(wù)邏輯中經(jīng)常會(huì)出現(xiàn)發(fā)送信息,發(fā)送郵件,記錄日志等等,這個(gè)時(shí)候用異步再好不過...
摘要:目前項(xiàng)目采用的是來實(shí)現(xiàn)異步任務(wù)。關(guān)于介紹通俗的來說是一個(gè)分發(fā)任務(wù)的程序框架使用的應(yīng)用通常有三部分組成一個(gè)一個(gè)一個(gè)任務(wù)服務(wù)器。的作用是提出一個(gè)任務(wù)交給任務(wù)服務(wù)器。請(qǐng)求的調(diào)度者,用來負(fù)責(zé)協(xié)調(diào)把發(fā)出的請(qǐng)求轉(zhuǎn)發(fā)給合適的。 眾所周知,PHP要實(shí)現(xiàn)異步任務(wù)一般都是通過 Gearman Beanstalkd 等第三方來實(shí)現(xiàn)的。目前項(xiàng)目采用的是 Gearman 來實(shí)現(xiàn)異步任務(wù)。 關(guān)于Gearman介紹...
閱讀 3323·2021-11-12 10:36
閱讀 2479·2021-11-02 14:43
閱讀 2155·2019-08-30 14:23
閱讀 3469·2019-08-30 13:08
閱讀 928·2019-08-28 18:09
閱讀 3139·2019-08-26 12:22
閱讀 3151·2019-08-23 18:24
閱讀 2023·2019-08-23 18:17