閱讀692 返回首頁    go 阿裏雲 go 技術社區[雲棲]


不要重複發明輪子:C++重用的5重境界(5)——消息通信(完結篇)

 

第五重境界:消息通信

話說當年明教教主在連乾坤大挪移的時候,實際上並沒有所謂的第7重,這第7重隻是創始人憑借著自己的聰明才智想出來的,根本無法證實是否正確,幸好張無忌沒有練才躲過一劫。

其實我們這裏的所謂第5重也是我憑空想出來的:)大家接下來也可以看到,這一重境界其實和C++或者DLL完全沒有關係,但這一重境界絕對不是憑空亂想,而且也絕對不是無法證實的,這一重境界是每個IT人都知道的,也許是每個人進入IT界接觸的第一個重用方法——消息通信

aha,是不是覺得很簡單、很普通、很傻很天真?!!

但是仔細想想,這確實是最高的重用境界,我們將這種方法與DLL方法來比較一下:

1)消息通信和編譯無關,DLL和編譯相關;

2)消息通信支持分布式部署,DLL不支持分布式部署;

3)消息通信和具體語言無關,C++的程序可以和Java的程序通信;

4)消息通信可以和操作係統無關,DLL和操作係統綁定的;

看起來消息通信這種方式幾乎完美了,那我們還要DLL幹嘛呢?前麵講了那麼多,那不是浪費口水和時間?

當然不是了,消息通信也存在缺點的:

1)要通過某種方式來收發消息,例如TCPSCTPTDM鏈路;

2)要製定協議來規定收發消息規則和行為規則;

3)要對發送消息和接受消息進行編解碼;

 

總結起來就是消息通信是重量級的,DLL是輕量級的。

 

廢話說了這麼多,我們舉一個簡單的樣例,由於消息通信實現比較複雜,這裏就不寫代碼了,簡單的描述一下。

例如係統有ABCD 4個模塊,都需要訪問數據庫,對數據庫進行操作,由於對數據庫的操作基本上建立連接、執行操作、釋放連接,這些操作基本上都是一樣的。

如果是DLL實現方式,那麼就把建立連接、執行操作、釋放連接做成DLL,然後由每個模塊去調用DLL的對應函數。

如果是消息通信,按照如下機製實現一個消息通信:

1)新建一個模塊E,這個模塊完成建立連接、執行操作、釋放操作的功能;

2)規定ABCD通過TCP/IPE通信;

3)規定消息格式,例如采用TLV編碼,或者二進製編碼等

4)規定消息內容,例如:發1標識建立連接、100表示建立連接結果,2表示釋放連接,200表示釋放連接的結果,等等

 

例子到這裏就結束了,是不是覺得很簡單,或者意猶未盡?

是的,一旦采用消息通信方式,你可以發揮的餘地就很大了,還是上麵那個例子,我們可以做很多的優化,例如:

1ABCD不再需要關注建立連接和釋放連接了,隻需要關注數據操作就ok了;

2E模塊可以采用連接池、多線程等技術來提高性能;

3)如果底層數據庫修改了,隻需要修改E就可以了,ABCD完全不需要任何修改,其實ABCD都不知道底層數據庫是Oracle還是DB2.

4E可以用任何編程語言編寫,也可以運行在任何操作係統上;

5E進程可以實現雙機主備等機製來保證可靠性或者性能;

……………………………………………………

 

總結

好不容易把這個東東講完了,也算是自己總結歸納了一下,當然,由於才疏學淺,難免出現遺漏和錯誤,還請大家糾正。

由於篇幅有限,每一篇都寫得比較簡單,基本上就是把設計思想介紹了一下,實際中應用肯定還有很多問題和細節需要大家去解決,在這裏就不一一細講了(例如第4重境界需要解決多線程的同步問題、第5重境界需要設計好消息格式和消息內容等)。

最後更新:2017-04-02 00:06:46

  上一篇:go opengl編程學習筆記(四)(紋理映射)(結合nvdia OpenglSDk 的nvimage類)
  下一篇:go 如何遍曆數據庫表格及每個表格的字段