[訊息論壇] ICE Messaging
Forum 蔣居裕
<技術篇> 新世代訊息技術深度剖析 ─ 細說
iPush® Server V2 (上)
在去年年底,艾揚正式推出了新一代的 iPush® Server
V2。除了傳承 iPush® Server V1.x 以來,一貫的 Publish/Subscribe
即時訊息鉅量連線服務能力之外,在訊息核心引擎中,又添加了許多新的功能特性,我們將會分兩期,與讀者細說分明。
總的來說,iPush® Server V2 此新一代產品的目標,是在既有的鉅量連線能力基礎之上,追求更高品質的訊息傳遞功能,讓
Developer 可以善用新增的各種訊息性能,更細緻地規劃各類的訊息應用系統。
回應訊息技術的運作原理,我們繪出這一張 iPush® V2
訊息通訊層級基本圖:
| 
|
| 圖一、iPush®
V2 訊息通訊層級基本圖
|
文字顏色說明
紫紅:為 iPush®
V2 新增之特性功能。
藍色:為 iPush®
V1.x 已有之特性功能,但 V2 又加以修改延伸。
黑色:為 iPush® V1.x、V2 所共同擁有之特性功能。
若您在未閱讀下面詳細說明之前,就能夠對上圖有一定的了解,那就表示您的訊息技術知識,已經累積到某種程度了喔!
以下就讓我們由下而上,針對基本圖來層層細說。而每一個下層的說明,都是在為其上層打下知識的基礎。
| 1. 網路通訊協定 (IP Network
Protocol) |
適用訊息傳遞模式:Pub/Sub 與 P2P
iPush® 的通訊基礎是 IP (Internet Protocol),在
IP 之上,除了原先 iPush® V1.x 即支援的 TCP 之外,iPush®
V2 又新增了 UDP 通訊協定來讓 Developer 選用。
關於 TCP 與 UDP 的不同通訊特性,我們不在此多做解釋,有興趣知道的,可以參考電子週報第
19 期的訊息技術說文解字:TCP
/ UDP。
Developer (或 AP) 選擇要使用 TCP 或是 UDP 的時機,是在 Client
AP 要與 iPush® Server 建立連線時。在 ActiveX 與 Java
Class API 上,使用 TCP 或是 UDP,都有一樣的函式名稱:
一旦連線建立之後,該 TCP 或 UDP 的有效性會一直持續,直到呼叫 ipushDisconnect()
中斷連線為止。
在一般情況下,我們建議您儘量使用 TCP 來進行連線。
| 2. 訊息傳遞模式 (Message
Model) |
在一個 TCP 或 UDP 連線期間,Developer 可以隨時視需要,啟用 Pub/Sub
或是 P2P 模式,來傳遞一個特定訊息。
我們就花一點篇幅來說明 Pub/Sub 與 P2P 的不同意含。
<Pub/Sub 訊息傳遞模式>
適用訊息定址方式:Channel Addressing
與 Subject Addressing
在以 iPush® Server 為核心的 Pub/Sub
訊息傳遞模式 (全名為 Publish/Subscribe;我們認為,這是比較重要的一種傳遞模式) 中,訊息傳送者
(Sender) 被稱為 Publisher,訊息接收者 (Receiver) 則被稱為 Subscriber。
使用 Pub/Sub,非常輕易就可以實作出各種的一對多 (1-to-n) 的即時訊息應用系統。如下圖二所示:
圖二、Pub/Sub
一對多訊息傳遞模式示意圖
我們以圖二的三動,配合 API 來說明
(ActiveX 與 Java Class 皆適用):
1. Subscribe Channel
/ Subject
On-line Subscribers
需先向 iPush® Server 訂閱 (Subscribe) 有興趣的訊息頻道
(Channel) 或主題 (Subject);iPush® Server 會負責紀錄所有
On-line Subscribers 的 Channel/Subject 訂閱資料 (Subscription
Mapping,即哪些 Subscribers 訂閱了哪些 Channel/Subject)。
API 呼叫可為:
-
ipushSubChannel():訂閱
Channel。
-
ipushSubSubject():訂閱
Subject。
-
ipushSubDSubject():持久性訂閱
Subject (Durable Subscription;容後文說明)。
2. Publish Message
On-line Publisher 將訊息依規劃送至 iPush®
Server 的特定 Channel/Subject。
API 呼叫可為:
-
ipushSendChannelData():送訊息給指定的
Channel。
-
ipushSendNPSubjectData():送非持續性
(Non-persistent) 訊息給指定的 Subject (Non-persistent Message;容後文說明)。
-
ipushSendPSubjectData():送持續性
(Persistent) 訊息給指定的 Subject (Persistent Message;容後文說明)。
3. Push Message
iPush® Server 即會根據 Subscription
Mapping,將訊息即時推播給這些對應的 On-line Subscribers,即使有多個。而 Client
端在收到訊息之後,即會由 Client API 觸發各類對應的:
交由 Client AP 去接手後續的訊息處理邏輯,進而達到事件觸發
(Event-driven) 的即時系統目標。
<P2P 訊息傳遞模式>
適用訊息定址方式:Subject Addressing
iPush® Server 的另一種訊息傳遞模式,稱之為 Point-to-Point
(簡稱為 P2P);而由於其運作最重要的標的為 Message Queue,所以又可稱為 Queuing。
相對於 Pub/Sub 的一對多訊息傳送,P2P 可以達到點對點,即一對一 (1-to-1)
的訊息傳送。
如前所提,P2P 的運作,乃是透過 Queue 達成的;被 Sender 指定為 Queue
的訊息,只會被 iPush® Server 傳送給一個 Receiver。也就是說,即使有多個訊息使用者都去訂閱同一個
Subject,但最終只會有一個訊息使用者接收到該則 Queue 的訊息。如下圖三所示:
圖三、P2P
一對一訊息傳遞模式示意圖
我們以圖三的三動,配合 API 來說明
(ActiveX 與 Java Class 皆適用):
1. Subscribe Subject
On-line Subscriber
需先向 iPush® Server 訂閱 (Subscribe) 有興趣的主題 (Subject);iPush®
Server 會負責紀錄所有 On-line Subscribers 的 Subject 訂閱資料 (Subscription
Mapping,即哪些 Subscribers 訂閱了哪些 Subject)。
API 呼叫可為:
2. Publish Message
On-line Publisher 將訊息依規劃送至 iPush®
Server 的特定 Subject。
API 呼叫可為:
3. Push Message
iPush® Server 即會根據 Subscription
Mapping,將訊息即時推播給這些 On-line Subscribers 其中的一個。而該 Client 端在收到訊息之後,即會由
Client API 觸發對應的:
交由 Client AP 去接手後續的訊息處理邏輯,進而達到事件觸發
(Event-driven) 的即時系統目標。
由以上之說明,針對 Subject 之訊息傳遞,以
Subscriber、Publisher、iPush® Server 三個角色對訊息模式之處理,可分別歸結如下:
對於 Subscriber 而言
對於 Publisher 而言
對於 iPush®
Server 而言
| 3. 訊息定址方式 (Message
Addressing) |
Channel
訊息安全保護:Packing
Subject 訊息安全保護:Scrambling
甚麼是訊息定址方式 (Message
Addressing)?
訊息定址就好像是郵政信箱號碼一般:寄信的人,朝某個已知的郵政信箱號碼
(如 Post Box 100, Taipei) 送信;而收信的人,則是到該郵政信箱,就可以拿到屬於他的信了。
相同的道理,發訊息的人,只要朝某個已知的訊息位址
(如 abcd, 或 ice.marketing.fred) 送訊息給 iPush®
Server;則該訊息位址的訂閱者,就能夠即時地收到該訊息了。
在 iPush®
Server V2 中,有兩種給定訊息位址的方式,一為 Channel ID,一為 Subject Name,即分別稱為
Channel Addressing 與 Subject Addressing。以下我們就來看看這兩者的定義規則。
<Channel
ID>
一個 Channel ID,則是由 4-Byte 來表示,它可以由
4 個 ASCII 字元所組成,也可以是 8 個 16 進位碼 (HEX) 來表示的 4 個字元組。例如:1234
與 0x31323334 表示的即是同一個 Channel。
字元 0x00 與 0x0a,不得做為
Channel ID 的任一字元;保留 ASCII 字元 x,不得做為 Channel ID 之首。
若 Channel ID 單獨定義為 '-',即表示沒有權限。例如將
Write Permission 設定成 '-',即表示該使用者沒有權限將訊息發送至任何 Channel。
在 Channel ID 的四個字元中,具有階層式的概念。如
abc 表示所有以 abc 開頭的 Channels。 當要定義的權限包含有多個 Channels
時,可以逗號 ',' 區隔即可。若是連續的 Channels,如 abcd,abce,abcf
則也可以使用 '-' 特殊字元作連接表示,如 abcd-f。
<Subject
Name>
一個 Subject Name 則是一段較易為人所理解的字串,例如
ICE.testing.subject,最大可接受長度為 224 字元。Subjects 同樣有階層的概念,並以
'.' 字元作為階層區隔字元,如 ICE.A 表示所有以 ICE.A. 開頭的
Subjects。
-
禁用字元:共有 9 個禁用的字元,'*'、'%'、','、'.'、space、tab、0x0D、0x0A、與
0x00 (此處是指在一個對定義者來說有意義的連續字串中,不允許出現這些字元)。
-
不建議使用字元:'-' 與其他非英文字元。
-
不像 iPush®
Server V1.5 – Subject Edition,在 iPush®
Server V2 BackOffice 中的 Subject Name,已經不須在前面加寫 %T
了。
-
以整體應用規劃而言,在 Pub/Sub 模式下,到底一個字串是
Channel ID 還是 Subject Name?將交給 Developer 選用的是 Channel
還是 Subject 相關函式呼叫來決定,如 ipushSendChannelData()
或是 ipushSendNPSubjectData();至於其有效性與正確性,則是交由
iPush® Server 中的 Channel Management 與
Subject Management 來決定。
若單獨定義 '*' 則表示為所有的 Subjects。
<舉例>
-
Abcd,*
:表示 Channel Abcd 與所有的 Subjects。
-
0x01-0xff,ICE.A
:表示第一個字元介於 0x01 至 0xff 間所有的 Channel, 以及以 ICE.A 開頭的 Subjects。
好,暫且打住,我們下期繼續向上發展。 |