而在 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,有幾個地方是需要特別注意的:
- task session 中的 attribute 與 checkpoint 可以在 jobs 執行發生錯誤時,自動的 failover 到其他的 grid node 上去以方便從中斷的地方繼續執行。
- 當 task 執行完畢後,儲存於 session 中,scope 屬於 GridCheckPointScope.SESSION_SCOPE 的 checkpoint 資訊都會被移除掉。
- 承上,若 scope 屬於 GridCheckpointScope.GLOBAL_SCOPE 的 checkpoint 資訊,則會繼續保留,而其他的 task 還是可以檢視此資訊。
- 在 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
沒有留言:
張貼留言