2007年12月13日 星期四

GridGain 程式開發(2) - Distributed Grid Task Session

要在分散式的環境下開發程式,各個 node 之間,各 job 之間的資訊交換與傳遞,通常是相當複雜且不容易處理的好的部分!

而在 GridGain 中,針對控制資訊交換的部分進行了完善的處理,並開放許多 SPI 可供使用者針對自身需求自行開發程客製化。

因此為了開發程式上可以更容易進入狀況,有一些觀念是必須事先瞭解的喔! 以下就慢慢來說明.........


Description

每當有 grid task 被執行時,就會產生相對應的 distributed task session 資訊,而這些資訊不僅在 grid task 中可以存取,連屬於此 grid task 的 grid jobs 也都可以存取喔!

反之,在 grid job 上的資訊,在 grid task 中可以看見,GridGain 會自動在 task 與 jobs 之間進行資訊的傳遞與交換。藉由這種機制,賦予使用者在開發程式上有相當大的彈性空間。

而 Grid Task Session 包含了兩個部分:attribute & checkpoint

這兩個部分可以從 task 進行存取,也可以從 jobs 中進行存取;當然 GridGain 中就提供了 GridTaskSession Interface,主要負責進行 Grid Task Session相關資訊的存取控制之用。

關於 attribute 與 checkpoint,有幾個地方是需要特別注意的:
  1. task session 中的 attribute 與 checkpoint 可以在 jobs 執行發生錯誤時,自動的 failover 到其他的 grid node 上去以方便從中斷的地方繼續執行。

  2. 當 task 執行完畢後,儲存於 session 中,scope 屬於 GridCheckPointScope.SESSION_SCOPE 的 checkpoint 資訊都會被移除掉。

  3. 承上,若 scope 屬於 GridCheckpointScope.GLOBAL_SCOPE 的 checkpoint 資訊,則會繼續保留,而其他的 task 還是可以檢視此資訊。

  4. 在 session 中資訊的排序,對任何的 job 都是相同的。例如不會出現 A job 看到 attribute A 在 attribute B 之前,B job 看到的卻相反,GridGain 保證在 session 中資訊的排序對 task 或是 jobs 都是相同的。


Connected Tasks


在分散式處理的環境中,通常分散出去的工作,執行完畢的順序都是不一定的,影響因素很多,有可能是 grid node 的繁忙程度、硬體效能、網路頻寬 .... 等等。

在這種情況下,若是有工作必須確定其順序來執行的需求,通常會需要加上許多額外的資訊來控制工作的完成順序,才有可能達成此目的。

而在 GridGain 卻替使用者解決了這個問題! 如何解決呢? 有兩種方式:

一種是透過設定 waitForAttribute(...) method 的方式,確定相關的資訊全部蒐集完成後再繼續進行工作!

另外一種則是設定 GridTaskSessionAttributeListener 的方式,針對 attribute 資訊的改變額外進行處理,以確保工作按照順序進行。


Session Injection

GridGain 提供了上述的這麼強大的功能,那要如何將 task session 加入到程式中使用呢? 答案是:Injection(注入) !

由於 GridGain 支援了 IoC(Inverse of Control),因此只要設定好 library、classpath 等部分,就可以透過「@GridTaskSessionResource」annotation 的方式加入 task session 囉!

而 annotation 不僅可以使用在 field 上,也可以使用在 method 上喔!! 以下用簡單範例說明:
//field
@GridTaskSessionResource
private GridTaskSession ses = null;

//method
@GridTaskSessionResource
void setSession(GridTaskSession ses) {
this.ses = ses;
} //end setSession

沒有留言:

張貼留言