2007年12月16日 星期日

GridGain 程式開發(4) - 開發指引

在開始進行 GridGain 程式開發之前,有一些程式設計上的重點是必須先瞭解的,一共有三個部分:

Serialization & Deserialization

在分散式的環境中,要讓 job 可以從某個 node 發出到 remote node 執行,必須使用稱為序列化(serialize)的機制。

而 Serialize 的作用是將 job 與 code serialize 成 byte stream 後,在透過網路傳送到 remote node 上,由 remote node 將其 deserialize 成為原本的 job 和 code 再開始執行!

當然其中有很多控制資訊與機制是包含在裡面的,加上了這些部分後,想當然爾實作複雜度會提高不少! 然而這些部分有許多 GridGain 都幫我們處理好了,因此就不再繼續探討了!

只是為了要讓程式可以正確傳送到 remote grid node 執行,以下幾個條件必須滿足:
  1. 每個 class 都必須實作 java.io.Serializable interface

  2. class 中 non-static 的 field 或是 method 都必須有實作 java.io.Serializable interface

  3. 傳入 method 的參數也是必須要實作 java.io.Serializable interface


Inner & Anonymous Classes

在 GridGain 中,通常 Grid Job 執行的實作,都是以 inner class 的方式進行實作的,而 inner class 有時會使用到 outer class 的參數! (inner class 是可以隨意存取 outer class 中的 field 的)

這個部分在之後的範例就可以很詳細的看到。


Overriding Methods with Gridify Annotation

這是在開發程式使用繼承時必須注意到的地方,千萬注意,「不要繼承加入 Annotation 的 method 的 class」,否則程式執行的結果往往不會是你預期的.....

以下用一段範例程式碼來說明:
public class A {
@Gridify
protected void methodA() {
...
}
};

public class B extends A {
@Override
protected void methodA() {
...
super.methodA();
...
}
}
由於 GridGain 使用 aspectJ 的關係,若是呼叫 B.methodA() 的話,實際上 B.methodA 的執行會變成兩次。

以下是 GridGain 運作的方式:
  1. 建立一個 class B 的物件

  2. 透過 B 物件呼叫 methodA(),由於此 method 沒有加上 annotation,因此 aspectJ 不會有動作

  3. methodA() 執行到一半,呼叫了 A.methodA()

  4. 由於 A.methodA() 有加上 annotation,因此 aspectJ 會呼叫 GridGain 並將呼叫此 A.methodA() 所屬的 method(此處為 B.methodA) 與 class(此處為 B) 序列化後傳到 remote grid node 上

  5. 因此不論是在 local node 或是 remote node 都會再次執行 B.methodA() => 因為 B.methodA() 是包含 Gridify A.methodA() 的 method

  6. 由於 B.methoda() 再度執行,因此又呼叫了 A.methodA()

  7. 此時 GridGain 偵測到此情況,就不會再將工作派送到 remote grid node 執行,而僅在 local 端執行完畢

因此,假設除了 local 外還有一個 remote grid node(共兩個 node);原本應該是 B.methodA() 執行一次,A.methodA() 執行兩次;由於錯誤的繼承方式,變成了 B.methodA() 執行兩次,反倒是 A.methodA() 僅執行一次。

沒有留言:

張貼留言