分佈式系統的工程化開發方法,學習筆記

http://blog.csdn.net/Solstice/archive/2010/10/19/5950190.aspx

此文寫的不錯,有一定的深度

 

1 分佈式系統的工程化開發方法

 

2 一聽到“分佈式”系統我的反應是

    多層次系統,併發多進程,協同計算

    附  corba,ejb ,webservice,rest分佈式 區別

 

3 今天我們談的分佈式系統

 

4 今天不談

 

5 先談錢

    分佈式系統的成本包括:軟硬件的成本,運維成本。這幾方面的成本應該是相互影響的,在一定的投入上產生出最大的收益(運算時間,支持用戶數等等),是分佈式系統設計的關鍵因素。

 

6 我們在技術浪潮中的位置

    單機編程的問題並沒有解決,隨着CUDA,多核編程的出現,在單機也會出現分佈式設計遇到的問題,分佈並行成爲程序設計的重難點。

    分佈式對象由於容錯性問題面臨淘汰,這句話也許是真的。

    soap正在被REST所取代(REST技術需要仔細查看一下

 

7 你的系統可以這樣設計

    無狀態取決於用戶需求,這裏面有幾個名詞:LVS,Heartbeat,HAProxy,keepAlive 這些都是常見的做負載均衡,心跳的工具

    VCS 可能是鏈接裏面的東西,Erlang是一種並行語言(期待進一步的研究來評價其優略

 

8 技術浪潮的前夕

    分佈式系統,不算是新的東西,由於其開發的複雜性,主流的框架不是很多,文中談到了一些主流技術,然後又否定了,確沒能提出更好的解決方案

 

9 我們怎麼辦

    沒有哪個“C++分佈式中間件”是成熟的!?

 

10 分佈式系統是一個險惡的問題

   有些難題其實可以繞道走,並不需要鑽牛角尖

 

11 開發可靠的商用系統的關鍵技術

    支持重啓和恢復

    容錯策略

 

12 分佈式系統本質困難

    檢錯 可靠性 可恢復

 

13 可靠性的基本指標MTBF

 

14 避免不切實際的可靠性指標

 

15 單機硬件的可靠性和容錯

 

16 硬盤與內存的誤碼率

 

17 其它必需停機和重啓的情況

 

18 對程序開發的影響

    (不認同)程序的可靠性依賴於程序邏輯的正確性,軟件系統的可靠性依賴於程序,操作系統以及硬件,文中犯了概念錯誤

     對於服務器而言,錯誤需要酌情處理,優化需要認真對待。重啓只是手段,不是目標,在合理的情況下優化服務器是可行的

 

19 “能重啓”作爲設計目標

    進程在設計時必需想清楚重啓的代價和方式

 

20 能重啓的進程

    只使用操作系統能回收的IPC (TCP)

    不使用生命期大於進程的IPC (跨進程的mutex,共享內存)

    不使用不能重建的IPC             (Pipes,父子共享文件描述符)

 

21 如何優雅的重啓

    客戶端failover

 

22 硬件故障與軟件故障

 

23 accept失敗的例子

    EMFILE錯誤,無法close socketfd,解決方法:open("/dev/null")

 

24 監控

    監控包括:自身進程,系統設備,文件等等

 

25 Naming Service

    DNS不適合快速failover,在程序中配置自己的name service

 

26 在程序中內置http服務器

    可以在運行時探察 procfs,提供html頁面進行狀態反饋

     包括:進程的狀態,業務對象狀態,支持stats命令 (需調查Muduo Inspector

 

27 從TCP協議中能學到什麼

    應用層協議中應該包含一段時間不重複的序號,以及超時處理,必要時可以校驗可靠性

 

28 阻塞

    a 單線程僵死

    b 固定容量線程池超限

    c 動態線程池資源耗盡

    d 網絡IO的阻塞

 

29 心跳協議的設計

    要設計在同一線程內,同一socket上面

 

30 RPC與HTTP

    RPC使用方便,但隱藏了很多不容忽視的細節;HTTP更適合做RPC

 

31 爲系統演化做準備

   a 應對客戶端和服務器的版本升級

   b 保存原有版本的log

   c 應對不同組建使用不同語言來寫

 

32 消息格式的選擇

   參考Google Protocol buffer或Apache Thrift

 

33 只使用最土最爛熟的技術

    進程間通訊只用TCP >100MB/s時,不使用OOB,SCTP,UDP

    進程內讀寫鎖不要用,信號量不要用

    用one event loop per thread + non blocking IO 作爲基本線程模型

 

附:

使用Erlang和Yaws開發REST式的服務

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章