Posted on 2011-05-22 10:30
dennis 閱讀(6277)
評論(6) 編輯 收藏 所屬分類:
模式與架構 、
涂鴉 、
軟件工程
一個公司大了,總有部分人要去做一些通用的東西給大家用,我這里說的基礎產品就是這類通用性質的東西,不一定高科技,但是一定很多人依賴你的東西來完成各種各樣的功能。做這樣的東西,有些體會可以說下。
首先,能集中存儲的,就不要分布存儲,數據集中存儲有單點的危險,但是比之分布式存儲帶來的復雜度不可同日而語。況且集中式的存儲也可以利用各種機制做備份,所謂單點風險遠沒有想象中那么大。
其次,能利用開源框架的,就不要重復造輪子。程序員都喜歡造輪子,但是造輪子的周期長,并且不一定造的更好。在強調開發效率的互聯網時代,如果能直接利用現有框架組裝出你想要的東西,迅速占領市場,比你造的高性能、高可用、高科技的輪子更實用。這個跟做新產品開發有點類似,迅速組裝,高效開發,然后再想辦法改進。
第三,要文本,不要二進制。協議要文本化,配置要文本化。不要擔心性能,在可見的時間里,你基本不會因為文本化的問題遇到性能瓶頸。
第四,要透明,不要黑盒。基礎產品尤其需要對用戶透明,你的用戶不是小白用戶,他們也是程序員,而程序員天生對黑盒性質的東西充滿厭惡,他們總想知道你的東西背后在做什么,這對于查找問題分析問題也很重要。怎么做到透明呢?設計,統計,監控,日志等等。
第五,要擁抱標準,不要另搞一套。已經有了久經考驗的HTTP協議,你就不要再搞個STTP,有了AMQP協議,你就不要再搞個BMQP。被廣泛認可的標準是一些業界的頂尖專家制定出來的,他們早就將你沒有考慮到的問題都考慮進去了。你自己搞的那一套,隨著時間推移你會發現跟業界標準越來越像,因為面對的問題是一樣的。使用標準的額外好處是,你有一大堆可用的代碼或者類庫可以直接使用,特別是在面對跨語言的時候。
第六,能Share nothing,就不要搞狀態復制。無狀態的東西是最可愛的,天然的無副作用。水平擴展不要太容易。
第七,要將你的系統做的越不“重要”越好,如果太多的產品依賴你的系統,那么當你的系統故障的時候,整個應用就完蛋了。我們不要擔這個責任,我們要將系統做的越來越“不重要”,別人萬一沒了你也能重啟,也能一定時間內支撐正常的工作。
第八,要專注眼前,適當關注未來。有遠見是好事,但是太多遠見就容易好高騖遠。為很小可能性設計的東西,沒有機會經歷實際檢驗,當故障真的發生的時候,你也不可能完全信賴它。更好的辦法是將系統設計得可介入,可在緊急情況下人工去介入處理,可介入是不夠的,還要容易介入。
第九,不要對用戶有假設,假設你的用戶都是smart programmer,假設你的用戶不需要位運算,假設你的用戶要同步不要異步。除非你對這個領域非常熟悉并實際使用過類似的東西,否則還是不要假設。
第十,咳咳,似乎沒有第十了,一大早憋了這么篇無頭無腦的Blog,大伙將就看看。