Gearman的主要作用:
1、Dispatch 任務排程(無負載排程)
2、Interface 多應用語言間接口
3、Parallel 并行計算
Gearmand的安裝
安裝需要系統提供了 libevent,如果沒有編譯就會報錯。編譯安裝完成後的提示如下:

其中 libsqlite3、lbdrizzle、libmemcached、libpq、tokyocabinet的支援都是對于持久化來說的,如果需要要確定系統中安裝了這些資料庫。
安裝完成後,gearmand 提供了以下這些配置參數
性能的問題:
gearmand 中使用到了多線程模型,其線程分為三種:
Listening and management thread 監聽和管理線程 - 隻有一個:主要負責接受連接配接請求,并配置設定給I/O線程
I/O Thread I/O 線程 - 可以有很多個:主要負責讀寫系統調用,解析資料包
Processing Thread 處理線程 - 隻有一個:負責管理清單和Hash表,管理唯一Key、任務的Handle、函數、任務隊列
剛才在 gearmand 的參數中看到,-t 可以指定I/O線程的數量。如果 沒有指定 t 或者 t = 0,則三個線程合為一個,所有的事情都在一個線程中處理。如果 -t 1 則有一個監聽和管理線程、一個I/O和處理線程;如果 -t 2 則每個類别一個線程,如果大于2,則建立更多的I/O線程。
官方提到,a 16 core Intel machine is able to process upwards of 50k jobs per second。
使用中應當關注的幾個問題:
1、Job Server 的單點問題。
實際上 Job Server 是存在單點問題的,我們隻能通過增加備援 Job Server 的方式來解決這個問題。就如官方的圖例所示,下圖:
我們可以通過配置域名、多個伺服器配置清單等方法,在遇到其中一個 Job Server 失敗時,将 Client 的請求轉向另外的 Job Server。這種情況下,Job Server 中原來存在的任務會發生丢失,除非使用了資料庫或其他類似的持久化方法。
2、Job Server 重新開機後,Worker會自動重新注冊。
通過 gearmand -vvvvvvv 分析發現,如果 gearmand 關閉并重新啟動後,原來的 worker 會馬上與 Job Server 建立連接配接,并詢問是否有任務。
3、使用持久隊列避免任務的丢失
因為 Gearmand 的隊列是放在記憶體中的,是以當機或重新開機事件會導緻隊列的丢失。為了避免這種情況,可以使用持久隊列,将隊列存儲在一個相對中立的位置。注意,持久隊列隻對于背景任務有效。
4、Gearman Worker 的無縫重新開機
我在實作Worker的過程中,采用了PHP腳本,腳本調用外部的配置檔案。如果外部的配置檔案修改後,需要重新啟動腳本才能夠使配置檔案中修改的變量生效,是以想要坐到無縫的重新開機。即腳本Stop、Start的過程不會影響正在進行的業務。
對于無縫重新開機的問題,我總結了如下幾個思路進行處理,解決的方法:
1、每次修改完代碼後,Worker需要手工重新開機(先殺死然後啟動)。
2、在Worker中設定,單次任務循環完成後,就對Worker進行重新開機。
3、在Worker中添加一個退出函數,如果需要Worker退出的時候,在Client端發送一個優先級比較高的退出調用。
4、在Worker中檢查檔案是否發生變化,如果發生了變化,退出并重新開機自身。
5、為Worker編寫信号控制,接受重新開機指令,類似于 http restart graceful 指令
另外,也可以使用 supervisord 。這個工具暫時還沒有了解,有興趣的朋友可以分享一下。
下面是我在部門内部分享時制作的PPT
<a href="http://www.slideshare.net/Wonwang/gearman-introduction-10452050">Gearman Introduction</a>
參考資料: