質疑 OSGi 的作用


最近和別人在 cnblogs 上就 OSGi 的作用進行了討論,由於那里面的人,只會從網上抄襲 n 年以前的網上套話,很少有自己的分析、見解,無法展開討論。特此寫搏客文章,闡明自己的觀點,同時希望和更多的人,對此技術,進行討論。

 

OSGi 是由 1999 年成立的 OSGi 聯盟提出的一個開放的服務規范,最初的目的是為嵌入式設備。

據我從網上搜索到的資料,目前 OSGi 主要用於 嵌入式設備,無數據庫的單機版程序,比如 Eclipse。

 

OSGi 目前在用的功能,主要是把某個模塊(OSGi 有個特別的名次,叫 bundle),加載進內存、運行、然后由總控程序決定什么時候從內存中卸載。

這一點很容易理解,Java 中有 ClassLoader 用於把 Java 類加載進內存,但並沒有特別的手段,把已經加載進內存的類,從內存中去掉。而像 Eclipse 這樣的程序,功能較多,比如有 jsp 編輯器、java 編輯器、XML 編輯器,並不需要一啟動,都把這些編輯器對應的類,加載到內存中。可以延遲加載,用到的時候,加載進 JVM 內存。延遲加載在 Java 中並不需要特別處理,因為默認就是如此:沒有用到的類不會加載進內存,用到的類,用到時才加載進內存。

但 Java 中並沒有特別的手段,去卸載已經運行過但現在不用的類。如果我們先打開一個 java 文件,Eclispe 啟動 java 編輯器,然后我們關閉 java 文件,打開一個 CSS文件,Eclispe 啟動 CSS 編輯器,此時應該把 java 編輯器從內存中去掉,但 Java 本身沒有提供這種功能。當然我們可以期待 Sun/Oracle 公司,未來可以在 Java 中提供這個功能。

Eclipse 使用 OSGi 來實現不用的插件,從內存中卸載掉,這點不錯,可以節省內存。但是我們大部分人的應用,並不需要這么做。因此,OSGi 這個技術,並不適合大多數應用。

很奇怪的是,很多 OSGi 愛好者,盲目相信 OSGi 可以動態更新版本。據我了解,Eclipse 如果通過網絡更新插件,是需要整個 Eclipse 重新啟動的,並沒有像這些愛好者所說的那樣,可以自動更新、無需重新啟動。也許,只要更新的是目前不用的模塊,可以做到“自動更新、無需重新啟動”。

 

汽車的音響不會同時播放 CD 和收音機,因此從聽 CD 換成聽收音機的時候,汽車控制程序可以把CD對應的 bundle 進行 unload。但是,從未聽說哪個汽車廠商說,可以在汽車高速轉彎的時候,汽車里面的控制程序正在運行制動力智能分配,你這時候可以通過網絡,更新“制動力智能分配”這一部分軟件。

 

Eclipse 更新插件后,重新啟動用時幾分鍾,大部分人可以接受,不接受大不了暫時不升級;汽車控制程序在高速轉彎時,絕大多數人都不會選擇在這個時候更新汽車軟件,除非腦子不正常,一般都會選擇在停下來,熄火,或者掛空檔、駐車擋,喝杯咖啡,讓 4S 店去升級汽車軟件。也就是說, OSGi 愛好者口中號稱的 OSGi 在 Eclipse、汽車軟件中的動態升級,不過如此。

 

動態替換模塊,前提是不丟失運行時數據,否則就是空談。OSGi 官網、文檔從未提到可以替換正在忙碌中的模塊。問題是,如果是替換不忙的模塊,非要用 OSGi 么?我可以把應用系統停下來,更新版本,重新啟動新版本軟件,然后喝杯咖啡,眯會兒眼睛,...

還有人提到電信軟件的動態替換,電信軟件的模塊是不忙的模塊么?

 

有數據庫的應用,可以借助數據庫來解決模塊之間的依賴問題:模塊 A 從表 1 讀數據,處理后 insert 到表2,模塊 B 從表 2 讀數據,處理后 insert 到表3。表面上看來,兩個模塊互相依賴,但是如果我們用獨立的 java.exe 來運行模塊 A、模塊 B,則可以達到 模塊 A 關閉幾分鍾然后啟動,不影響模塊 B。
也就是說,有數據庫的應用,模塊之間的依賴,有額外的辦法解決,而這個辦法,不需要制定什么標准,不需要學習什么新知識,總之一個詞:容易!

 

這也是目前 OSGi 只用在無數據庫系統中的原因。可惜很多人看不到這一點。

 

這里有一段搞笑的話(http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-osgi/):

除了模塊化以及面向服務編程之外,OSGi的另一個重要特點是其動態性,Bundle以及Bundle提供的服務可以隨時消失或者重新加入,而其它使用服務的Bundle可以感知服務是否可用,並動態地改變自己的行為。

搞笑之處在於,“而其它使用服務的Bundle可以感知服務是否可用,並動態地改變自己的行為。”,如果我要調用一個發送傳真的模塊,結果感知“發送傳真模塊”暫時不可用,程序接下來能做什么?等?罵娘?哭?嚎叫?怎么做都不合適,尷尬!

在不用 OSGi 的情況下,我不需要“感知”其他模塊是否可用,直接調用,出錯就報錯。程序邏輯清楚、簡單。加入 OSGi 后,我需要“感知”其他模塊是否可用,還需要“動態地改變自己的行為”,復雜,麻煩,怎么做都不舒服!如果我每個模塊,都需要“感知”其他各個模塊是否可用,都需要決定如何處理各種額外情況,何等幾何級的復雜!這哪是人干的活!這就是 OSGi 的麻煩!

我覺得,OSGi 目前只做了一件事:處理 Java 做不好的 unload class 功能。考慮到現在內存如此便宜,4G 內存滿天飛,手機內存也穩步增長,其它嵌入式設備的內存,也在增長。是否一定要 unload 掉不用的類,好像也不是很必要!畢竟不是很多軟件,能把計算機內存撐爆的。

 

很奇怪的是,現在很多人在吹 OSGi,覺得這是一個萬金油,哪里都可以用。真不知道這些人是怎么想的。

另外,即使是好用的東西,也要看使用成本。奔馳車好,能讓所有人去買奔馳?OSGi 程序開發調試困難,學習也花時間,難道可以忽略不計?

 

至於 OSGi 解決模塊化的依賴問題,更是胡鬧。大不了我每個 “模塊” 單獨用一個 java.exe 來 運行,還有依賴問題么?有什么必要用 OSGi?

 

補充,很多人回復中都提到 Eclipse ,好像 Eclipse 使用 OSGi 是因為  OSGi 很強大什么的,不過,從這篇文章中,可以看出,不是這么回事:

OSGi: Eclipse的根基

http://www.builder.com.cn/2007/0929/528796.shtml

有很多人問Eclipse為什么要兼容OSGI規范而不是其他的規范呢?
在Eclipse被捐贈出來以前,Eclipse由OTI來開發,其目標是開發一個嵌入式Java軟件的開發平台。互聯網上現在仍然由很多的連接指向 Visual Age Micro Edition (VAME). 這也是SWT被構思的一個原因,他們想將SWT使用在嵌入式設備中的用戶界面。這種淵源關系解釋了當時為什么選擇OSGI規范。
另外一個原因是除了OSGI沒有其他的規范...

...

 

2012/7/26, 再補充:

在 http://zh.wikipedia.org/wiki/OSGi 上,寫明:“OSGi原先關注於服務網關,其實可用於多個方面。現在OSGi規范已經用於從移動電話到開源的Eclipse(其中包括了與IBM的OSGi框架SMF兼容的開源版本)。 OSGi服務平台的應用包括:服務網關、 汽車、移動電話、 工業自動化、建築物自動化、 PDA 網格計算、娛樂(如iPronto)、和 IDE。”。只字未提數據庫應用、企業應用。在英文版本的 http://en.wikipedia.org/wiki/OSGi 頁面上,大同小異。

迄今為止,有什么大公司,把 OSGi 用在一個有數據庫的系統中么?沒有!不明白那么多人糊里糊塗的把OSGi 用在自己的一個有數據庫系統中,是哪根神經不對了。

 

====歡迎轉載,轉載請注明出處

====歡迎大家下載試用折桂單點登錄系統, http://zheguisoft.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM