python模塊介紹-gearman:程序排程 概述

python模塊介紹-gearman:程序排程

概述

Gearman是一套用來把程序需求委派給機器,提供通用的程序框架來將任務分發在機器運算。它同時具有並行工做的能力、負載均衡處理的能力,以及在不一樣程序語言之間溝通的能力。gear的英文意思是齒輪。特色以下:前端

  • Open Source且社區活躍。python

  • Multi-language: 多國語言接口。shell

  • Flexible: 靈活,不拘泥於具體設計模式,能夠快速將應用程序分佈運做。好比使用Map/Reduce.數據庫

  • Fast: 協議簡單快速,支持多線程,服務器端用C/C++書寫,效率高。編程

  • Embeddable: 快速與輕量,適合嵌入式環境。後端

  • 無單點失敗: 不只能夠將系統模組化,也能容錯方式進行。centos

  • 穩定: Craig’s List, Tumblr, Yelp, Etsy等已經多年使用.設計模式

原理

Gearman最初在LiveJournal用於圖片resize功能,因爲圖片resize須要消耗大量計算資源,所以須要調度到後端多臺服務器執行, 完成任務以後返回前端再呈現到界面。Gearman分佈式任務實現原理上只用到2個字段,function name和data。function name即任務名稱,由client傳給job server, job server根據function name選擇合適的worker節點來執行。api

  • 組成服務器

    • Client: 負責創建工做,發送需求 (application) 給 Job Server,Job Server 會找適合的Worker轉發工做。

    • Job Server: 瞭解Client 端的需求,並查看哪一個機器能夠處理這項要求,在系統裏它一般會是個Daemon。

    • Worker: Worker 經過 Job Server 的分派,開始執行 Client 端的工做。

  • 消息隊列

    • 執行 Message Queue服務的 Job Server 能夠是多臺服務器組成,也就是分散式架構,在 Job Server 上執行 Worker 程式。

    • 這些 Worker 程式會一直循環地等候,直到 Job Server 呼叫它執行工做。

    • Client 端發送出需求以後,會將須要的資料及動做記錄在 Job Server 上,這時 Job Server 會查看是否有空閒並符合需求的 Worker。

    • 在 Worker 結束工做後,會發送通知給 Job Server ,這時 Job Server 就會視情況把結果回傳給 Client。

    • Client 端不需等候需求的執行結果,能夠直接繼續執行其餘動做。

負載方式

  • Job Server 負載方式

    • Client 可能同時發出多個需求給 Job Server,由 Message Queue處理。

    • Job Server 開始處理多個需求,若其中一個發生問題,能夠 Failover 到其餘的機器。

    • Worker 會將多個需求一塊兒進行運算,再看是同步或異步模式,回傳結果給 Client。

  • 同步 (Synchronous)

    • 同步(Synchronous) 是指 Client 將需求 (Application) 丟給 Gearmand。

    • 由 Gearmand 分派 Job 給各 Worker 去處理。

    • 並同步 Response 回傳給 Gearmand 告訴 Client 如今進度。

  • 異步 (Asynchronous):

    • Client 將需求 (Application) 丟給 Gearmand。

    • 由 Gearmand 分派 Job 給各 Worker 去處理。

    • Worker 處理完畢後,纔會將結果回傳給 Gearmand 告訴 Client 如今進度

快速入門

安裝(centos爲例):

yum -y install gearmand

安裝python

pip install gearman

api

啓動:

gearmand -L 192.168.0.232 -p 4730 -u root -d

查看狀態:

# telnet 10.0.0.51 4730status
task01      0       0       1

自帶實例:

# gearman -h localhost -p 4730 -w -f task01 -- wc -l  
# gearman -h localhost -p 4730 -f task01 < /etc/passwd

worker.py

import osimport gearmanimport mathclass CustomGearmanWorker(gearman.GearmanWorker):
    def on_job_execute(self, current_job):
        print "Job started"
        return super(CustomGearmanWorker, self).on_job_execute(current_job)def task_callback(gearman_worker, job):
    print job.data    return job.data

new_worker = CustomGearmanWorker(['192.168.0.232:4730'])new_worker.register_task("echo", task_callback)new_worker.work()

client.py

from gearman import GearmanClient

new_client = GearmanClient(['192.168.0.232:4730'])current_request = new_client.submit_job('echo', 'foo')new_result = current_request.resultprint new_result

高級特性

在一個 Web 應用程序內可能有許多地方都會用到 Gearman。能夠導入大量數據、發送許多電子郵件、編碼視頻文件、挖據數據並構建一箇中央日誌設施 — 全部這些均不會影響站點的體驗和響應性。能夠並行地處理數據。並且,因爲 Gearman 協議是獨立於語言和平臺的,因此您能夠在解決方案中混合編程語言。好比,能夠用 PHP 編寫一個 producer,用Python, C、Ruby 或其餘任何支持 Gearman 庫的語言編寫 worker。

一個鏈接客戶機和 worker 的 Gearman 網絡實際上可使用任何您能想象獲得的結構。不少配置可以運行多個代理並將 worker 分配到許多機器上。負載均衡是隱式的:每一個可操做的可用 worker(多是每一個 worker 主機具備多個 worker)從隊列中拉出做業。一個做業可以同步或異步運行並具備優先級。

Gearman 的最新版本已經將系統特性擴展到了包含持久的做業隊列和用一個新協議來經過 HTTP 提交工做請求。對於前者,Gearman 工做隊列保存在內存並在一個關係型數據庫內存有備份。這樣一來,若是 Gearman 守護程序故障,它就能夠在重啓後從新建立這個工做隊列。另外一個最新的改良經過一個 memcached 集羣增長隊列持久性。memcached 存儲也依賴於內存,但被分散於幾個機器以免單點故障。

Gearman 是一個剛剛起步卻頗有實力的工做分發系統。據 Gearman 的做者 Eric Day 介紹,Yahoo! 在 60 或更多的服務器上使用 Gearman 天天處理 600 萬個做業。新聞聚合器 Digg 也已構建了一個相同規模的 Gearman 網絡,天天可處理 400,000 個做業。Gearman 的一個出色例子能夠在 Narada 這個開源搜索引擎(參見 參考資料)中找到。

本文地址

參考資料

相關文章
相關標籤/搜索