第二類依賴則可以更進一步,將其放到獨立的進程中。現(xiàn)在稍具規(guī)模的系統(tǒng),登錄、注銷功能已經(jīng)從應用中脫離而出,要么采用SSO的方案來進行登陸,要么干脆代理給別的登錄系統(tǒng)。大連微信在線支付開發(fā)團隊在開發(fā)過程中發(fā)現(xiàn),緩存的讀寫實際上可以放到獨立的進程中進行(而不是類似 EhCache 的方案,直接運行于所在的環(huán)境中),于是發(fā)明了現(xiàn)在鼎鼎有名的Memcached。我們之前進行一個項目,發(fā)現(xiàn)支付模塊完全能夠獨立出來,于是將其進行隔離,形成了一個新的、沒有界面的、永遠在運行的系統(tǒng),通過 REST 處理支付請求。在另外 一個出版項目中,我們發(fā)現(xiàn)編輯編寫報告的過程實際上與報告發(fā)行過程雖然存在類級別的重用,但在業(yè)務層面是獨立的。最終我們將大連微信在線支付開發(fā)報告發(fā)行過程做成了一個常駐服務,系統(tǒng)其他的模塊通過MQ消息與其進行交互。
致遠服軟認為:http://www.soft8.com.cn/這一解決方案應該不難理解。與解決方案1不同的是,這一方案更多 的是要對系統(tǒng)進行面向業(yè)務層面的思考。由于系統(tǒng)將會以獨立的進程來運行這一模塊,在不同的進程中可能存在一定的代碼重復。例如Spring同時存在于兩個不相關的項目中大家覺得沒什么大不了的;但如果是自己的某 個業(yè)務組件同時在大連軟件定制二次開發(fā)項目的兩個進程中出現(xiàn),許多人就有些潔癖不能接受了(題外話:這種潔癖在OSGI環(huán)境中也存在)。
這里需要提醒的是:當處于不同的進程時,它們在物理上、運行時上已經(jīng)徹底隔離了,必須以進程的觀點去思考整個架構(gòu),而不是簡單的物理結(jié)構(gòu)。
從單進程模型到多進程模型的架構(gòu)思維轉(zhuǎn)變也不太容易——需要架構(gòu)師有意識地加強這方面的練習。流行的.NET和Java世界傾向于把什么都放到一起,而Linux世界Rails/Django則能更好地平衡優(yōu)秀產(chǎn)品之間的進程協(xié)調(diào),例如Memcached的使用。
另外,現(xiàn)在多核環(huán)境越來越多,我們與其費盡心思在編程語言層面上不如享受多核的好處,多進程能夠簡單并且顯著地利用多核能力。
現(xiàn)在將眼光看更遠一些,想象一下我們在做一個類似于開心網(wǎng)、Facebook、人人網(wǎng)的系統(tǒng)。它們的共同特點是能夠接入幾乎無限的第三方應用,無論是買賣朋友這類簡單的應用,還是絢麗無比的各種社交游戲。神奇的是,實現(xiàn)這一點并不需要第三方應用的開發(fā)者采用跟它們一樣的技術平臺,也不需要服務端提供無限的運算能力——大部分的架構(gòu)由開發(fā)方來控制。
在大連微信在線支付開發(fā)應用中實現(xiàn)這個并不難,這其中的秘訣在于:當用戶通過Facebook訪問某個第三方應用的時候,F(xiàn)acebook實際上通過后臺去訪問了第三方應用,將當前用戶的信息(以及好友信息)通過HTTP POST送到第三方應用指定的服務網(wǎng)址,然后將應用的HTML結(jié)果渲染到當前頁面中。從某種意義上講,這種技術本質(zhì)上是一種服務器端的mashup(詳情參考InfoQ文章)。