• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            陳碩的Blog

            Muduo 網(wǎng)絡(luò)編程示例之九:簡單的消息廣播服務(wù)

            Muduo 網(wǎng)絡(luò)編程示例之九:簡單的消息廣播服務(wù)

            陳碩 (giantchen_AT_gmail)

            Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

            這是《Muduo 網(wǎng)絡(luò)編程示例》系列的第九篇文章,講用 muduo 實(shí)現(xiàn)一個簡單的 pub/sub 服務(wù)

            Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

            本文介紹用 muduo 實(shí)現(xiàn)一個簡單的 topic-based 消息廣播服務(wù),這其實(shí)是“聊天室”的一個簡單擴(kuò)展,不過聊天的不是人,而是分布式系統(tǒng)中的程序。

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

             

            在分布式系統(tǒng)中,除了常用的 end-to-end 通信,還有一對多的廣播通信。一提到“廣播”,或許會讓人聯(lián)想到 IP 多播或 IP 組播,這不是本文的主題。本文將要談的是基于 TCP 協(xié)議的應(yīng)用層廣播。示意圖如下:

            hub

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

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

            (“可靠廣播、原子廣播”在分布式系統(tǒng)中有重大意義,是以 replicated state machine 方式實(shí)現(xiàn)可靠的分布式服務(wù)的基礎(chǔ),“可靠廣播”涉及 consensus 算法,超出了本文的范圍。)

             

            應(yīng)用層廣播在分布式系統(tǒng)中用處很大,這里略舉幾例:

            1. 體育比分轉(zhuǎn)播。有 8 片比賽場地正在進(jìn)行羽毛球比賽,每個場地的計分程序把當(dāng)前比分發(fā)送到各自的 topic 上(第 1 號場地發(fā)送到 court1,第 2 號發(fā)送到 court2,以此類推)。需要用到比分的程序(賽場的大屏幕顯示,網(wǎng)上比分轉(zhuǎn)播等等)自己訂閱感興趣的 topic ,就能及時收到最新比分?jǐn)?shù)據(jù)。由于本文實(shí)現(xiàn)的不是 100% 可靠廣播,那么消息應(yīng)該是 snapshot,而不是 incremental。(換句話說,消息的內(nèi)容是“現(xiàn)在是幾比幾”,而不是“剛才誰得分”。)

            2. 負(fù)載監(jiān)控。每臺機(jī)器上運(yùn)行一個監(jiān)控程序,周期性地把本機(jī)當(dāng)前負(fù)載(CPU、網(wǎng)絡(luò)、磁盤、溫度)publish 到以 hostname 命名的 topic 上,這樣需要用到這些數(shù)據(jù)的程序只要在 hub 訂閱相應(yīng)的 topic 就能獲得數(shù)據(jù),無需與多臺機(jī)器直接打交道。(為了可靠起見,監(jiān)控程序發(fā)送的消息里邊應(yīng)該包含時間戳,這樣能防止 stale 數(shù)據(jù),甚至一定程度上起到心跳的作用。)沿著這個思路,分布式系統(tǒng)中的服務(wù)程序也可以把自己的當(dāng)前負(fù)載發(fā)布到 hub 上,供 load balancer 和 monitor 取用。

            協(xié)議

            為了簡單起見,muduo 的 hub 示例采用以 '\r\n' 分界的文本協(xié)議,這樣用 telnet 就能測試 hub。協(xié)議只有三個命令:

            • sub <topic>\r\n
              • 該命令表示訂閱 <topic>,以后該 topic 有任何跟新都會發(fā)給這個 tcp 連接。在 sub 的時候,hub 會把該 <topic> 上最近的消息發(fā)給此 subscriber。
            • unsub <topic>\r\n
              • 該命令表示退訂 <topic>
            • pub <topic>\r\n<content>\r\n
              • 往 <topic> 發(fā)送消息,內(nèi)容為 <content>。所有訂閱了此 <topic> 的 subscribers 會收到同樣的消息“pub <topic>\r\n<content>\r\n”

            代碼

            muduo 示例中的 hub 分為幾個部分:

            一個程序可以既是 publisher 又是 subscriber,而且 pubsub 庫只用一個 tcp 連接(這樣 failover 比較簡便)。

            使用范例:

            1. 開啟 4 個命令行窗口
            2. 在第一個窗口運(yùn)行 $ hub 9999
            3. 在第二個窗口運(yùn)行 $ sub 127.0.0.1:9999 mytopic
            4. 在第三個窗口運(yùn)行 $ sub 127.0.0.1:9999 mytopic court
            5. 在第四個窗口運(yùn)行 $ pub 127.0.0.1:9999 mytopic "Hello world."  ,這時第二三號窗口都會打印 “mytopic: Hello world.”,表明收到了 mytopic 這個主題上的消息。
            6. 在第四個窗口運(yùn)行 $ pub 127.0.0.1:9999 court "13:11"  ,這時第三號窗口會打印 “court: 13:11”,表明收到了 court 這個主題上的消息。第二號窗口沒有訂閱此消息,故無輸出。

            借助這個簡單的 pub/sub 機(jī)制,還可以做很多有意思的事情。比如把分布式系統(tǒng)中的程序的一部分 end-to-end 通信改為通過 pub/sub 來做(例如,原來是 A 向 B 發(fā)一個 SOAP request,B 通過同一個 tcp 連接發(fā)回 response (分析二者的通信只能通過查看 log 或用 tcpdump 截獲);現(xiàn)在是 A 往 topic_a_to_b 上發(fā)布 request,B 在 topic_b_to_a 上發(fā) response),這樣多掛一個 monitoring subscriber 就能輕易地查看通信雙方的溝通情況,很容易做狀態(tài)監(jiān)控與 trouble shooting。

            posted on 2011-05-25 23:21 陳碩 閱讀(2389) 評論(2)  編輯 收藏 引用 所屬分類: muduo

            評論

            # re: Muduo 網(wǎng)絡(luò)編程示例之九:簡單的消息廣播服務(wù) 2011-05-26 01:31 tfzxyinhao

            能不能多寫一些你的庫的特色以及這種特色的原理,是怎么實(shí)現(xiàn)的。怎么優(yōu)化的。。。。
              回復(fù)  更多評論   

            # re: Muduo 網(wǎng)絡(luò)編程示例之九:簡單的消息廣播服務(wù) 2011-05-26 10:22 陳碩

            @tfzxyinhao
            有此計劃。  回復(fù)  更多評論   

            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類

            隨筆檔案

            相冊

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产秦先生| 久久er99热精品一区二区| 777米奇久久最新地址| 久久精品二区| 久久香综合精品久久伊人| 国产精品99久久久久久宅男小说| 欧美日韩久久中文字幕| 日韩av无码久久精品免费| 久久久黄片| 亚洲成色www久久网站夜月| 国产精品日韩深夜福利久久| 精品久久亚洲中文无码| 久久无码人妻精品一区二区三区 | 午夜精品久久久久久中宇| 久久国产精品成人影院| 久久中文字幕无码专区| 麻豆精品久久久一区二区| 婷婷久久久亚洲欧洲日产国码AV| 精品午夜久久福利大片| 亚洲综合伊人久久综合| 国产色综合久久无码有码| 91久久国产视频| 久久久久久亚洲精品不卡| 精品熟女少妇a∨免费久久| 午夜精品久久久久久久| 亚洲国产成人久久笫一页| 亚洲欧洲精品成人久久奇米网| 精品午夜久久福利大片| www性久久久com| 天堂久久天堂AV色综合| 99久久国产亚洲综合精品| 久久久久国产亚洲AV麻豆| 91亚洲国产成人久久精品| 国产精品国色综合久久| 99999久久久久久亚洲| 色婷婷综合久久久中文字幕| 午夜精品久久久久久久久| 久久综合综合久久综合| 久久青青草原亚洲av无码app | 亚洲国产天堂久久综合网站| 久久综合丝袜日本网|