不要重複發明輪子:C++重用的5重境界(5)——消息通信(完結篇)
第五重境界:消息通信
話說當年明教教主在連乾坤大挪移的時候,實際上並沒有所謂的第7重,這第7重隻是創始人憑借著自己的聰明才智想出來的,根本無法證實是否正確,幸好張無忌沒有練才躲過一劫。
其實我們這裏的所謂第5重也是我憑空想出來的:)大家接下來也可以看到,這一重境界其實和C++或者DLL完全沒有關係,但這一重境界絕對不是憑空亂想,而且也絕對不是無法證實的,這一重境界是每個IT人都知道的,也許是每個人進入IT界接觸的第一個重用方法——消息通信。
aha,是不是覺得很簡單、很普通、很傻很天真?!!
但是仔細想想,這確實是最高的重用境界,我們將這種方法與DLL方法來比較一下:
1)消息通信和編譯無關,DLL和編譯相關;
2)消息通信支持分布式部署,DLL不支持分布式部署;
3)消息通信和具體語言無關,C++的程序可以和Java的程序通信;
4)消息通信可以和操作係統無關,DLL和操作係統綁定的;
看起來消息通信這種方式幾乎完美了,那我們還要DLL幹嘛呢?前麵講了那麼多,那不是浪費口水和時間?
當然不是了,消息通信也存在缺點的:
1)要通過某種方式來收發消息,例如TCP、SCTP、TDM鏈路;
2)要製定協議來規定收發消息規則和行為規則;
3)要對發送消息和接受消息進行編解碼;
總結起來就是消息通信是重量級的,DLL是輕量級的。
廢話說了這麼多,我們舉一個簡單的樣例,由於消息通信實現比較複雜,這裏就不寫代碼了,簡單的描述一下。
例如係統有A、B、C、D 4個模塊,都需要訪問數據庫,對數據庫進行操作,由於對數據庫的操作基本上建立連接、執行操作、釋放連接,這些操作基本上都是一樣的。
如果是DLL實現方式,那麼就把建立連接、執行操作、釋放連接做成DLL,然後由每個模塊去調用DLL的對應函數。
如果是消息通信,按照如下機製實現一個消息通信:
1)新建一個模塊E,這個模塊完成建立連接、執行操作、釋放操作的功能;
2)規定A、B、C、D通過TCP/IP與E通信;
3)規定消息格式,例如采用TLV編碼,或者二進製編碼等
4)規定消息內容,例如:發1標識建立連接、100表示建立連接結果,2表示釋放連接,200表示釋放連接的結果,等等
例子到這裏就結束了,是不是覺得很簡單,或者意猶未盡?
是的,一旦采用消息通信方式,你可以發揮的餘地就很大了,還是上麵那個例子,我們可以做很多的優化,例如:
1)A、B、C、D不再需要關注建立連接和釋放連接了,隻需要關注數據操作就ok了;
2)E模塊可以采用連接池、多線程等技術來提高性能;
3)如果底層數據庫修改了,隻需要修改E就可以了,A、B、C、D完全不需要任何修改,其實ABCD都不知道底層數據庫是Oracle還是DB2.
4)E可以用任何編程語言編寫,也可以運行在任何操作係統上;
5)E進程可以實現雙機主備等機製來保證可靠性或者性能;
……………………………………………………
總結
好不容易把這個東東講完了,也算是自己總結歸納了一下,當然,由於才疏學淺,難免出現遺漏和錯誤,還請大家糾正。
由於篇幅有限,每一篇都寫得比較簡單,基本上就是把設計思想介紹了一下,實際中應用肯定還有很多問題和細節需要大家去解決,在這裏就不一一細講了(例如第4重境界需要解決多線程的同步問題、第5重境界需要設計好消息格式和消息內容等)。
最後更新:2017-04-02 00:06:46