實際技術選型的考慮因素

發表於2013-10-28

最近在工作中我需要把資料從公共的Data Warehouse(資料倉儲)匯出來,放到屬於我們team自己賬號的雲端儲存資源中去,然後再在我們的應用中查詢這樣的資源。需要匯出資料是因為直接從Data Warehouse查詢資料是一個緩慢而且非同步的過程,而我們的應用資料查詢需要實時性。現在要解決這個問題有一些AWS的服務可供我們可以選擇,基本上分成了兩大類:

520131028105159

第一類是儲存和內容分發(Storage & Content Delivery):

  • CloudFront:CloudFront是用於內容分發給不同地區使用者的,它在全球設有數個“edge”,作為臨近網路訪問資料的入口。就如同大網站建立的CDN裝置一樣。這顯然不是我需要的。
  • Glacier:Glacier非常用來適合儲存不常用的、壓縮的和備份的海量檔案資料,在集中檔案儲存的服務中,它是最便宜的。比如儲存日誌、備案資料等等。當然,它犧牲了資料傳輸的效能和一致性。顯然它也不適合我的場景。
  • S3:S3(Simple Storage Service)適合儲存原始資料、大物件(單個上限5Tb),費用比資料庫服務低。如果我最終決定使用檔案系統來儲存資料,它是一個好的選擇。另外,無論是Glacier還是S3,層級概念上最大的以及都是地區級別的(在Glacier裡面叫做vault,在S3裡面叫做bucket,每個這樣的單元都位於某一個地區,例如Asin Pacific),因此如果需要全球多個節點訪問同一份資料,需要額外把資料分發到各個地區去。
  • Storage Gateway:Storage Gateway是用於整合IT環境的內部部署的,它支援基於閘道器快取的優化或者是閘道器儲存的優化,便於本地和臨近網路快速獲取資料。它可以用於公司內部不同地理位置的檔案共享、映象或者備份,也不適合我這裡的場景。

選擇檔案儲存不能提供資料庫的條件查詢等功能,目前我的場景下並不需要,我只需要根據不同的區域和資料唯一鍵來獲取資料集就可以了,否則,我需要考慮資料庫服務:

  • DynamoDB:DynamoDB是掛在雲上的NoSQL資料庫服務,每一張表都需要指定一個hash的主鍵或者是hash加range兩層的主鍵,同時,它的資料讀取和儲存的最小單位是4KB,也就是說,存取0.5KB和4KB的資料,效能表現是幾乎一樣的。從資料量來看,如果選擇資料庫服務,它是最適合解決我的問題。
  • SimpleDB:和DynamoDB相似,非關係型資料庫,結構可隨意變換,而且資料自動索引,所以查詢是非常快的。它的資料容量小得多,有一個典型用法是使用SimpleDB來儲存S3的檔案地址,就像“指標”一樣。但是它的容量限制需要考慮,每個domain只有10G的上限,可以建立多個domain,但是那樣就需要應用自己來路由選擇domain了。關於一致性,它和DynamoDB一樣,可以選擇最終一致性和強一致性,當然,強一致性需要花費更多錢,還會降低吞吐量。
  • ElastiCache:把Memcached或者Redis搬到了雲上,這顯然不是我需要的。
  • RDS:RDS(Relational Database Service)相當於把關係型資料庫搬到了雲上,它和DynamoDB或者SimpleDB的區別,主要就是RDB和NoSQL DB的區別。
  • RedShift:RedShift是一個資料倉儲服務,利用列式儲存技術及節點間並行分散式查詢,對於上P的資料訪問做了優化。

這裡還可以找到這幾個AWS上資料庫服務的不同,用一表以蔽之:

If You Need Consider Using
A relational database service with minimal administration Amazon RDS, a fully managed service that offers a choice of MySQL, Oracle or SQL Server database engines, scale compute & storage, Multi-AZ availability and more.
A fast, highly scalable NoSQL database service Amazon DynamoDB, a fully managed service that offers extremely fast performance, seamless scalability and reliability, low cost and more.
A NoSQL database service for smaller datasets Amazon SimpleDB, a fully managed service that provides a schemaless database, reliability and more.
A relational database you can manage on your own Your choice of relational AMIs on Amazon EC2 and EBS that provide scale compute & storage, complete control over instances, and more.

再有另一個技術選型的例子,在web容器中選擇Tomcat還是Jetty。Jetty結構簡單,容易定製其元件,也就是說,小和簡單(這也是當初Google選擇它作為app引擎的最重要原因),是它最大的優勢。Jetty在同時處理大量連線並且需要長時間保持這些連線的時候,效能上更有優勢,因為它是基於NIO,而不是Tomcat的BIO來處理請求的;但是我們也能找到很多效能測試的資料,在對於連線生命週期非常短而且非常頻繁的請求,Tomcat的效能要優於Jetty。

620131028105220

以下摘選自《Jetty VS Tomcat Performance Comparison》的二者比較:

Jetty Features and Powered:

  • Full-featured and standards-based.
  • Embeddable and Asynchronous.
  • Open source and commercially usable.
  • Dual licensed under Apache and Eclipse.
  • Flexible and extensible, Enterprise scalable.
  • Strong Tools, Application, Devices and Cloud computing supported.
  • Low maintenance cost.
  • Small and Efficient.

Tomcat Features and Powered:

  • Famous open source under Apache.
  • Easier to embed Tomcat in your applications, e.g. in JBoss.
  • Implements the Servlet 3.0, JSP 2.2 and JSP-EL 2.2 support.
  • Strong and widely commercially usable and use.
  • Easy integrated with other application such as Spring.
  • Flexible and extensible, Enterprise scalable.
  • Faster JSP parsing.
  • Stable.

在選擇實現技術的時候經常會遇到這樣或那樣的選擇題,上面的兩個例子,都是相對理性地分析和比較的例子。我們考慮的內容往往包括功能、效能、社群支援、擴充套件性和定製性、已知問題和約束等等。

但是,具有諷刺意味的是,仔細想想,實際上我們選擇某一項技術的最重要的原因,卻遠遠不是那些“理智的分析”,而是下面這些:

  • “因為大家都在用它啊”,比如專案用Java或者C++作為主要語言來實現,我想很多人和我一樣,經常並沒有經過太多思考,這似乎是一個思維慣性。
  • “因為我沒有用過這項技術,我感興趣,我想學一下”,其實這也無可厚非,我以前也經歷過一個專案組,大部分人(包括主管在內),都排斥使用新技術,原因是擔心風險。我原則上認同風險一說,但是適度範圍內給程式設計師選擇技術的自由從長遠看是有好處的,尤其是技術也是需要進步的。把所有問題都讓“工程商人”來解決,只會讓目光過於淺近。
  • “因為我只知道它啊”,這種情況更多。你為什麼選擇C3P0連線池?因為那時候我不知道還有哪些別的資料庫連線池……

工程師總會在技術選型的時候尋找某種平衡,紙面上未必會寫這三條理由,但是心裡面,有意識無意識地,一定會給向著這三條理由傾斜。

現在讓我們退一步,倘若我們都非常理性地評估了類似技術的優缺點,但是在真正使用技術實現的時候,卻發現,實際上這幾條類似的技術都可以實現,選哪個關係並不大。因為資料規模、問題大小,都不足以到了非得區分類似技術優劣的地步。舉例來說,持久層使用MyBatis還是Hibernate,優秀的程式設計師可以說出二者各自的好處是什麼,也許對於大型專案至關重要;但是也有程式設計師會吐槽,其實用哪個都可以啊,好處壞處的差異並沒有那麼明顯,因為我的專案那麼小,需要的資料庫讀寫如此簡單……

有人說,小專案可以幫助拓寬技術視野,但是隻做小專案無法深入瞭解技術本身,因為你無從比較並理解類似技術的優劣。這也是“玩具程式碼”在學新東西的時候有成就感,也很適合技術分享的膠片之用,卻無法帶來工程師持續成長的原因。

你覺得是不是這樣呢?

相關文章