摘要:啟動和如下信息則表示成功查看版本安裝擴(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)識GearmanGearman 只是一個分布式程序調(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 wwwPHP使用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 IGearman的管理工具
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
摘要:但是這需要對文件以及有非常深入的理解,同時由于存在多種形式,分析實(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...
摘要:文件分發(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ù)載均衡...
摘要:異步操作廢話不說直接進(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ā)送郵件,記錄日志等等,這個時候用異步再好不過...
摘要:目前項(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介紹...
閱讀 3315·2021-11-12 10:36
閱讀 2467·2021-11-02 14:43
閱讀 2146·2019-08-30 14:23
閱讀 3463·2019-08-30 13:08
閱讀 919·2019-08-28 18:09
閱讀 3129·2019-08-26 12:22
閱讀 3141·2019-08-23 18:24
閱讀 2017·2019-08-23 18:17