天天看點

Gearman的問題分析與深入研究

Gearman的主要作用:

1、Dispatch 任務排程(無負載排程)

2、Interface 多應用語言間接口

3、Parallel 并行計算

Gearmand的安裝

安裝需要系統提供了 libevent,如果沒有編譯就會報錯。編譯安裝完成後的提示如下:

Gearman的問題分析與深入研究

其中 libsqlite3、lbdrizzle、libmemcached、libpq、tokyocabinet的支援都是對于持久化來說的,如果需要要確定系統中安裝了這些資料庫。

安裝完成後,gearmand 提供了以下這些配置參數

Gearman的問題分析與深入研究

性能的問題:

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 的方式來解決這個問題。就如官方的圖例所示,下圖:

Gearman的問題分析與深入研究

我們可以通過配置域名、多個伺服器配置清單等方法,在遇到其中一個 Job Server 失敗時,将 Client 的請求轉向另外的 Job Server。這種情況下,Job Server 中原來存在的任務會發生丢失,除非使用了資料庫或其他類似的持久化方法。

2、Job Server 重新開機後,Worker會自動重新注冊。

通過 gearmand -vvvvvvv  分析發現,如果 gearmand 關閉并重新啟動後,原來的 worker 會馬上與 Job Server 建立連接配接,并詢問是否有任務。

Gearman的問題分析與深入研究

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>

參考資料:

繼續閱讀