Dubbo詳細介紹與安裝使用過程
應用程式的通訊成本
什麼是通訊
一個程式中兩個以上功能相互傳遞訊號或資料叫做通訊。
什麼是成本
這是是指時間成本與空間成本。 時間就是傳遞資料所花費的時間。空間是指傳遞過程耗費容量大小。
都有哪些通訊方式
- 全域性變數
- 執行緒間通訊
- 共享記憶體
- 共享檔案
- 管道
- Socket
- 硬體(串列埠,USB) 等等
全域性變數
全域性變數是成本最低通訊方法,通過設定全域性變數,在程式執行時過程中均可操作該變數,使用者訊號傳遞,資料傳輸。
執行緒間通訊
執行緒間通訊也是採用全域性變數方式,通常執行緒庫會提供一套完善的API供使用者使用,它可以實現共享,鎖,互斥等機制。
共享記憶體
共享記憶體是在記憶體中申請開闢一個區域,用於資料共享儲存。
共享檔案
將資料儲存在檔案中,供多執行緒,多程序訪問,檔案可以上鎖與解鎖,這種方式效能最差,但對於初級開發者非常適合。 通過將檔案儲存在tmpfs或shm 檔案系統中,可以獲得不錯的效能。
管道
管道是字元裝置,通常是fifo(先進先出)單向通訊,如果需要雙工可能使用兩個管道。
Socket
Socket分為 unix socket 與 tcp/udp socket. 前者只能在unix like 系統中使用。 Socket 分為阻塞與非阻塞通訊。 其中tcp/udp Socket 可以跨伺服器傳輸資料。
硬體
例如串列埠通訊,使用串列埠連線兩臺電腦,通常速率為 9600bps,115200bps A電腦中執行
cat /dev/ttyS0
B電腦執行
cat /etc/passwd > /dev/ttyS0
可以將/etc/passwd檔案從A電腦傳遞到B電腦。
不再本文討論範圍,這裡不多述。
現在我們已經清楚了各種通訊方式,這些通訊方式適用於不同場景,由此出現了很多種使用方式,甚至多種方式同時使用。
伺服器池概念
網際網路時代的特點是,伺服器不在單一一種,而是各種異構系統,我們經常會看到一個網站有多個伺服器組成,因此我們將應用分佈在不同的伺服器上執行。 例如 Web伺服器,應用伺服器,快取伺服器,資料庫伺服器各司其職。就應用伺服器還可能分成很多種類,例如搜尋,內容管理,使用者中心,等等。 問題來了,你會發現你的每個團隊開發出一個產品,都需要一個伺服器執行,每個團隊都在做獨立系統。不同團隊開發出的功能與其他產品並不相容,於是有了介面這種東西。 運維的問題也來了,每個應用一個伺服器不太現實,但每個專案都不想與其他專案公用一個伺服器資源,於是有了虛擬機器。
於是我們見到的系統是這樣了
+--------+
| C 應用 |
+--------+
^ ^ ^
| | |
+--------+ <-----+ | +-----> +--------+
| A 應用 | <--------+--------> | B 應用 |
+--------+ <-----+ | +-----> +--------+
| | |
V V V
+--------+
| D 應用 |
+--------+
A 應用 執行中會與其他三個伺服器產生通訊,一次操作建立三次連線,這樣的通訊成本是非常高的,如果任何一個節點出現故障都出現阻塞。 從運維角度這種配置也極其繁瑣,每個節點都要配置與其他連點連線,防火牆ACL 維護也非常繁瑣。 出現故障,排查也非常困難,還會消耗大量的排查時間。
進一步優化
我們將公共呼叫部門放在一處,然後將所有資源都放在伺服器上。通過負載均衡分發呼叫,高可用技術解決公用介面單點問題。
+----------+
| 公共介面 |
+----------+
^ ^ ^
| | |
+------------+ | +------------+
| | |
V V V
+--------+ +--------+ +--------+
| A 應用 | | B 應用 | | C 應用 |
| B 應用 | | C 應用 | | A 應用 |
| C 應用 | | A 應用 | | B 應用 |
+--------+ +--------+ +--------+
這樣的好處顯而易見,伺服器節點充分使用,既有高可用,又有負載均衡,保障7*24小時無故障執行。部屬也方便。 注意上面:每個節點的 A,B,C 應用 加權值不同。
耦合與解耦
耦合級別有變數級別、函式級別、方法級別、類級別、包級別、協議級別、語言級別、資料流級別、快取級別、資料庫級別、以及業務級別。 你需要根據當時場景適當耦合或解耦。例如理論上軟體執行速度是在同一個實體機上執行效率最高,有時可能將其設計為分散式才能體現效率。