Muduo 網路編程樣本(九)簡單的訊息廣播服務

來源:互聯網
上載者:User

本文介紹用 muduo 實現一個簡單的 topic-based 訊息廣播服務,這其實是“聊天室”的一個簡單 擴充,不過聊天的不是人,而是分布式系統中的程式。

本文的代碼見 http://code.google.com/p/muduo/source/browse/trunk/examples/hub

在分布式系統中,除了常用的 end-to-end 通訊,還有一對多的廣播通訊。一提到“廣播”,或許 會讓人聯想到 IP 多播或 IP 組播,這不是本文的主題。本文將要談的是基於 TCP 協議的應用程式層廣播 。示意圖如下:

上圖中圓角矩形代表程式,"Hub"是一個服務程式,不是網路集線器,它起到類似集線器 的作用,故而得名。Publisher 和 Subscriper 通過 TCP 協議與 Hub 程式通訊。Publisher 把訊息發 到某個 topic 上,Subscribers 訂閱該 topic,然後就能收到訊息。即 publisher 藉助 hub 把訊息 廣播給了多個 subscribers。這種 pub/sub 結構的好處在於可以增加多個 Subscriber 而不用修改 Publisher,一定程度上實現了“解耦”(也可以看成分布式的 observer pattern)。 由於走的是 TCP 協議,廣播是基本可靠的,這裡的“可靠”指的是“比 UDP 可靠”,不是“完全可靠”。(思考 :如何避免 Hub 成為 single point of failure?)

為了避免串擾(cross-talk),每個 topic 在同一時間只應該有一個 publisher,hub 不提供 compare-and-swap 操作。

(“可靠 廣播、原子廣播”在分布式系統中有重大意義,是以 replicated state machine 方式實現可靠的分布 式服務的基礎,“可靠廣播”涉及 consensus 演算法,超出了本文的範圍。)

應用程式層廣播在分布 式系統中用處很大,這裡略舉幾例:

1. 體育比分轉播。有 8 片比賽場地進行中羽毛球比賽 ,每個場地的計分程式把當前比分發送到各自的 topic 上(第 1 號場地發送到 court1,第 2 號發送 到 court2,以此類推)。需要用到比分的程式(賽場的大螢幕顯示,網上比分轉播等等)自己訂閱感 興趣的 topic ,就能及時收到最新比分資料。由於本文實現的不是 100% 可靠廣播,那麼訊息應該是 snapshot,而不是 incremental。(換句話說,訊息的內容是“現在是幾比幾”,而不是“剛才誰得分 ”。)

2. 負載監控。每台機器上運行一個監控程式,周期性地把本機當前負載(CPU、網路、 磁碟、溫度)publish 到以 hostname 命名的 topic 上,這樣需要用到這些資料的程式只要在 hub 訂 閱相應的 topic 就能獲得資料,無需與多台機器直接打交道。(為了可靠起見,監控程式發送的訊息 裡邊應該包含時間戳記,這樣能防止 stale 資料,甚至一定程度上起到心跳的作用。)沿著這個思路, 分布式系統中的服務程式也可以把自己的當前負載發布到 hub 上,供 load balancer 和 monitor 取 用。

協議

為了簡單起見,muduo 的 hub 樣本採用以 '/r/n' 分界的文本協議 ,這樣用 telnet 就能測試 hub。協議只有三個命令:

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。