2009年7月6日 星期一

積非成是: "Multiple Background servers"

故老相傳: "Background只能有一個". 我猜, 大部分的顧問都會這麼說. 要不是蛋兄(詳見緣起), 我現在一定還是這麼說. 去年就想寫這個主題, 但知道很花力氣, 所以一直逃避. 然而心裡一直有個疙瘩 . 最後想想畢竟這是個有意義的主題, 終究是寫了.

真相之路蠻曲折的! 至少第一次探索從Egg問起的"Queue-Group"與System Admin Guide裏語焉不詳的暗示多個Background的可能性, 演變到從頭反思Method Sever與Background Server的定義與目的... 幾乎是要發掘真相. 可惜忽略了一個重要線索, 追到後來還是失敗了. 儘管如此, 我覺得這個探詢的過程蠻有趣的, 或許也能延伸出一些討論. 所以把他記在另一篇"有關"只能有一個Background Server"的疑點".

直到去年準備PDMLink9.0 System Admin的教育訓練時, 順便研讀Advanced Deployment Guide. 那時才發現, 此文件裏居然對多個Background Servers的設定有詳細的解釋 (韋爵爺: ㄉ...ㄉ償所望..). 細讀之後. 更覺得其中的設定方法及可能也適用之前的版本. 因此以PDMLink8做測試, 終於證實多個Background Server是可能的.

進入此主題之前請先參閱設定多個Method Server的相關文件或是參考"有關"只能有一個Background Server"的疑點"也可.

Advanced Deployment Guide中有關設定多個Background Servers的介紹節錄如下:

首先是有關啟動Background Server的命令設定, 也就是上次探尋的終點. 簡單來說, 能針對個別Background Server設定啟動命令, 就能夠指定該Background Server負責的Queues. 如此就有機會避開重複執行Queue中工作的問題. 這次文件交代得很清楚: 每個Background Server須要有個自己的名字(Service Name), 啟動指令就是利用這個名字來定義. 格式為: "wt.manager.cmd.(service name)", 定義在wt.properties裡的Property. 所以如果我們要設定兩個Background servers且為它們取了名字: "BackgroundMethodServer_0" 與 "BackgroundMethodServer_1", 那我們就需要 "wt.manager.cmd.BackgroundMethodServer_0" 與 "wt.manager.cmd.BackgroundMethodServer_1"兩個Properties. 至於設定Property的設定值 之前我們見過了, 格式如下:
wt.manager.cmd.
(service name)=(Method server's Java command) wt.method.serviceName=(service name) wt.queue.executeQueues=true wt.queue.queueGroup=(Queue-group names) wt.adapter.enabled=false wt.method.minPort=(port number)

上述的(Method server's Java command)基本上就是像 "java -classpath ... wt.method.MethodServerMain" 這樣的東西. 我們可以抄系統預留的Property "wt.manager.cmd.BackgroundMethodServer" 設定當範本, 用$(wt.manager.cmd.MethodServer)就行了. 至於 "wt.method.serviceName=(service name)", 基本上這裡的"(service name)"就是"wt.manager.cmd.(service name)"中的"(service name)". 而 "wt.queue.queueGroup=(Queue-group names)" 不難猜, 是用來指定該Background Server負責的queue groups, 並以","來區隔. 最後, "wt.method.minPort=(port number)", 用來指定該Background Server所使用的TCP/IP port.

以名為"BackgroundMethodServer_0"的Background server為例, 設定如下:

wt.manager.cmd.BackgroundMethodServer_0=$(wt.manager.cmd.MethodServer) wt.method.serviceName\=BackgroundMethodServer_0 wt.queue.executeQueues\=true wt.queue.queueGroup\=default wt.adapter.enabled\=false wt.method.minPort\=3000

看來很完美? 故事還沒完!

試想, 系統怎麼知道有兩個Background Server分別叫作"BackgroundMethodServer_0" 與" BackgroundMethodServer_1"? "wt.manager.monitor.start.BackgroundMethodServer=2" 僅僅讓系統知道需要啟動兩個Background Servers, 並沒有透露其他訊息. 從Advanced deployment guide 中的範例發現 他的"wt.manager.monitor.services"是這麼設的:

wt.manager.monitor.services=MethodServer BackgroundMethodServer_0 BackgroundMethodServer_1

原來如此, "MethodServer", "BackgroundMethodServer_0", "BackgroundMethodServer_1"都是"(service name)"啊! 以前習慣照抄 "wt.manager.monitor.services=MethodServer BackgroundMethodServer"這樣的設定. 從來沒想到系統居然用"wt.manager.monitor.services"裡面定的"service names", 如"MethodServer" 與 "BackgroundMethodServer", 來找到對應的 properties: "wt.manager.cmd.MethodServer" 與 "wt.manager.cmd.BackgroundMethodServer". 所以在這個範例, "BackgroundMethodServer"須以"BackgroundMethodServer_0 BackgroundMethodServer_1" 來取代 如此才能讓系統套用 "wt.manager.cmd.BackgroundMethodServer_0" 與 "wt.manager.cmd.BackgroundMethodServer_1".

以下是我在PDMLink 8上進行測試時的一些畫面:

wt.properties新增的設定


以下為開機後的畫面: 除了Method sever正常啟動外, 真的跑出兩個Background servers.

BackgroundMethodServer_0: Listening port: 3000





BackgroundMethodServer_1: Listening port: 4000




建立一個新的Queue名為"david_01", 隸屬於 "david"這個 queue-group. 另外寫了個小程式塞了個工作進去, 每隔十分鐘會印出"Hello!". 如上面的設定, 所有"david"群組的Queues都是由BackgroundMethodServer_1管的. 果然過一會 "Hello" 出現在這.


再拉一個簡單的流程, 用來證明他會被 "BackgroundMethodServer_0"處理


嘿... 真的耶!


1 則留言:

  1. 上午在和Esther討論MethodServer與Background Server的觀念時 突然想到: "wt.manager.monitor.start.MethodServer" 這個用來指定method server 數量的property, 會不會也是一個"有彈性"的設計? 會不會它其實是"wt.manager.monitor.start.ServiceName"的特例? 而這ServiceName須符合"wt.manager.monitor.services"裏頭定義的某一個"service name"? 如"wt.manager.monitor.services=ServiceName1, ServiceName2,..."? 例如原始設定為:
    "wt.manager.monitor.services=MethodServer"
    "wt.manager.monitor.start.MethodServer=1"
    這兩個properties裏的"MethodServer"會不會只是個Service Name?

    如果如此, 我其實應該把wt.manager.monitor.start.BackgroundMethodServer=2"undefine"掉 或清成"0". 改用
    "wt.manager.monitor.start.BackgroundMethodServer_0=1" 與
    "wt.manager.monitor.start.BackgroundMethodServer_1=1" 才真正符合背後的原則?

    回覆刪除