目前為止,本專欄 系列 已經探究了 Google 和 Amazon 平台中的雲端運算。 雖然它們在實現和結構上存在不同,但兩種平台都支援快速和可擴充的部署方式 。它們可以快速經濟地組裝、測試、運行和維護 Java 應用程式,這無疑是前所 未有的。但是,雲並不是影響如今 Java 開發速度的唯一因素。開源解決方案還 可以協助您迅速組裝軟體應用程式,因為您不再需要編寫大量代碼。手動編寫對 象關係映射(ORM)、日誌或測試架構的時代已經一去不複返。這些問題已經隨 時間逐漸得到瞭解決,然後又再次出現在了開源領域中 — 再次面臨這些問題 — 但這些解決方案幾乎始終要比您自己的好。
關於本系列
從 Java 技術首次亮相以來,Java 開發的格局已經發生了巨大的變化。得益 於成熟的開源架構和可靠的租用式部署基礎設施,現在已經可以迅速經濟地裝配 、測試、運行和維護 Java 應用程式了。在本系列中,Andrew Glover 將探索使 這種全新開發範例成為可能的各種技術和工具。
在 Java 開發的整個過程中,開源創新簡化了應用程式的裝配過程。全新的 開來源資料庫 Apache CouchDB(截至撰寫本文時的發行版為 0.10.0) 也不例外 。搭建好 CouchDB 環境之後可以輕鬆地使用它。您只需要操作它的 HTTP 串連 即可;既不需要 JDBC 驅動程式,也不需要第三方控制管理平台。在本文中,我 將向您介紹 CouchDB 並展示如何使用它提升開發速度。考慮到安裝的簡便性, 您將使用 Amazon 的 EC2 平台。並且,您將通過一個方便易用的 Groovy 模組 來與它通訊。
面對文檔的資料庫
關聯式資料庫基本上主導了資料庫市場。但其他類似的資料庫 — 包括 面向對 象 和 面向文檔 資料庫,兩者在面向關係的世界中極為不同 — 也不時發揮著 舉足輕重的作用。CouchDB 是一種面向文檔的資料庫。它是無模式的,並且允許 您以 JavaScript Object Notation (JSON) 字串的形式來儲存文檔。
JSON
JSON 是一種輕量級的資料交換格式,同時也是 Web 應用程式的替代格式。 它類似於 XML,但遠沒有它那麼詳細。得益於其輕量級特性,它正成為 Web 的 通用語。
試想一個違規停車罰單。該罰單將涵蓋以下項目:
違規的日期
時間
位置
車輛的描述
牌照資訊
違規情況
罰單上收集的格式和資料因管轄權而異。即使對於單一管轄許可權內的標準停 車罰單來說,它們的內容也很有可能存在不同。舉例來說,警官在開罰單時可以 不填寫時間,或者可以省略車型,而只填寫牌照的詳細資料。地點可以是兩條街 道的組合(比如 Fourth 和 Lexington 的交匯處),或者是某個固定地址(比 如說 19993 Main Street)。但所採集資訊的語義大抵相似。
罰單的資料點可以在關聯式資料庫中建模,但詳細資料卻有點麻煩。舉例來說 ,如何有效在關聯式資料庫中捕獲某個交匯點呢?並且在沒有街道交匯的情況下, 資料庫是否會使用空欄位來表示第二個地址呢(假定建模方式為在各列中捕獲不 同的街道名)?
在這些情況下,關聯式資料庫的抽象化程度可能 會稍高一些。所需的資訊已經 採用了文檔(罰單)的形式。為什麼不將資料建模為文檔呢?這樣可以不用死守 嚴格的關係模式,而只需要大致遵循進階模式的語義。這正是 CouchDB 的用武 之地。它允許您以靈活的方式來對這些域類型進行建模 — 成果是一個完備的文 檔,它沒有模式,而是使用與其他文檔大致相似的藍圖。
MapReduce
Google 獨創的 MapReduce 是一個用於處理海量資料集的概念架構。它是一 種高度最佳化的應用大量電腦的分布式問題解決機制。MapReduce 包含兩個函數 :map 和 reduce。map 函數用於接受大量輸入,並將它們分割為較小的部分( 同時將這些資料傳遞給其他進程)。reduce 函數的作用是將來自 map 的所有單 獨輸出整合為一個最終的輸出。
藉助 CouchDB,您可以搜尋文檔、文件屬性甚至在關係世界中關聯文檔。您 的實現方式是使用視圖,而不是 SQL。從本質上說,視圖是您採用 MapReduce 樣式(在 JavaScript 中)編寫的函數;也就是說,您最終只需要編寫一個 map 函數和一個 reduce 函數。這些函數將共同過濾或提取文檔資料,或者有效利用 它們之間的關係。事實上,CouchDB 具備足夠的靈活性,只要底層文檔沒有發生 發化,它就只需要運行這些函數一次,從而加快視圖處理過程。
CouchDB 最有意思的地方是它的設計方式。CouchDB 體現了 Web 本身的基本 (也是極為成功的)概念。它公開了一組全面的 REST 式 API,允許建立、查詢 、更新和刪除文檔、視圖和資料庫。這使得 CouchDB 的使用變得非常簡單。您 不需要藉助其他驅動程式或平台來開始開發:一個瀏覽器便能完成所有工作。也 就是說,豐富的庫使 CouchDB 的使用變得非常簡單 — 但從內部來看,它們僅 僅是通過 HTTP 來利用 REST 式概念。
與 Web 的本質特性相類似,CouchDB 在設計時融入了大量可擴充因素。它是 使用並發程式設計語言 Erlang 編寫的,它支援綁定分布式、容錯、不間斷應用程式 。該語言(現已開源可用)是由 Ericsson 開發的,並在電信環境中得到了廣泛 應用。