• <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>

            CppExplore

            一切像霧像雨又像風

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              29 隨筆 :: 0 文章 :: 280 評論 :: 0 Trackbacks

            作者:CppExplore 網(wǎng)址:http://www.shnenglu.com/CppExplore/
            網(wǎng)絡(luò)請求包經(jīng)過網(wǎng)絡(luò)層(技術(shù)系列綜述(一))被解析翻譯成程序自定義的消息,之后被投遞到業(yè)務(wù)線程的線程消息隊列(技術(shù)系列綜述(二))中。業(yè)務(wù)線程在隊列的另一端取出消息,開始處理,這是本章要介紹的部分。業(yè)務(wù)處理部分:主要有會話類(Session)和會話管理類(SessionManager,常見該類為單例)。先給出類圖,后文詳細介紹:

            一 SessionManager的職責
            (1)繼承IMsgThread(技術(shù)系列綜述(二)),調(diào)用該類的start方法,啟動業(yè)務(wù)線程
            (2)提供on_.../do_...方法技術(shù)系列綜述(二)),供其它線程向業(yè)務(wù)線程投遞消息,以及消息在業(yè)務(wù)線程的處理入口。
            (3)主要的私有屬性是session類的容器對象。容器類的選型的依據(jù),首先是查詢性能,之后是插入刪除的性能。
            array:數(shù)組下標為session對象的seesionid_(此處sessionid,不要理解為常見協(xié)議中的session字段,可以理解為session對象的索引)。可以做到插入刪除(參考內(nèi)存管理chunk分配算法)查詢都在o(1)完成,缺點不能動態(tài)增大。同樣可以參考定長內(nèi)存池的分配算法,動態(tài)申請255個array為一個chunk,所有chunk使用vector管理,各chunk中array編號遞增255,同樣可以達到增刪查o(1)的效率。
            缺點:(1)sessionid_重復使用,加上消息經(jīng)過消息隊列形成的處理延遲,可能造成下一個session對象處理上一個同樣sessionid的session對象遺留下來的消息,實際使用中每個session對象有自己的狀態(tài)機,這種殘留的消息危害并不大。(2)需要自己實現(xiàn),對比map的o(logn),這點細微的性能提升無任何意義(也就是減少了幾次整型之間的對比)。相比不需要自己額外實現(xiàn)的普通數(shù)組還算有點實用價值。
            vector:如果被插入的session的sessionid是遞增的,查詢可以做到折半查找logn的性能,但隨機刪除造成的內(nèi)存移動是o(n),無法接受。
            map:以紅黑樹為基礎(chǔ)實現(xiàn)。增刪查找的性能都可以平穩(wěn)的保持在o(logn),sessionid_為整型或者其operater<實現(xiàn)簡單的時候是最常用的容器。
            hash_map:哈希表,使用大量內(nèi)存盡量使數(shù)據(jù)均勻分布,查詢性能分hashcode的計算(hash函數(shù))和查找部分,hash函數(shù)一般為所有有效信息的移位計算(經(jīng)典的是字符串的33算法)疊加,查找部分最理想的是0(1),最差是0(n),取決于hash函數(shù)計算結(jié)果碰撞的幾率。當sessionid_為字符串或者其operater<實現(xiàn)復雜的時候常用。
            (4)該類處理消息的方式舉例如下:(容器以map<int,session *> mapSessions_為例)

            void do_msg_type_1_(MsgData &msg)
            {
              
            int id=msg.sessionid;
              
            if(mapSessions_.find(id)!=mapSessions_.end())
              
            {
                session 
            *pSession=mapSessions_[id];
                pSession
            ->on_msg_1(msg);
              }

              
            else
              
            {
                write_warning_log;
              }

            }


            如上例所示,session管理類對消息的處理方式必須簡單固定,方便可持續(xù)維護、擴充。
            二 Session的職責
            (1)數(shù)據(jù)結(jié)構(gòu):每一路連接的業(yè)務(wù)處理部分,首先有sessionid_標記session本身,其次包含業(yè)務(wù)處理需要的必須的數(shù)據(jù)部分,另外最重要的一個數(shù)據(jù)結(jié)構(gòu)就是狀態(tài)機了。
            (2)狀態(tài)機。狀態(tài)機標識session對象的狀態(tài),接收外部輸入的事件,驅(qū)動狀態(tài)機運行,并作出行為響應(yīng)。詳細見技術(shù)系列之 狀態(tài)機(一)技術(shù)系列之 狀態(tài)機(二),不多說了。
            (3)方法。主要分兩類:on_msg和do_event。舉例如下:

            void on_msg(MsgData &msg)
            {
                EventData 
            event;
                
            event.detail=msg.detail;//todo
                fsm.do_event(event);
            }

            void do_event..(EventData &event)
            {
                
            //change session's data or send msg to other thread or response request or others.. 
            }

            注意:
            1、所有有可能改變session內(nèi)蘊狀態(tài)的操作都必須納入狀態(tài)機的嚴格控制,不能存在不通過狀態(tài)機即可改變session內(nèi)蘊狀態(tài)的操作入口。
            2、如果兩個狀態(tài)對同樣的事件做出同樣的反應(yīng),并且都遷移到相同的狀態(tài),那么這兩個是同一個狀態(tài)。
            3、盡可能減少狀態(tài)的個數(shù)。如果兩個狀態(tài)具有嚴格的時序關(guān)系,處理的事件不同并且有嚴格的時序關(guān)系,那么考慮合并這兩個狀態(tài),防止狀態(tài)機膨脹。

            三 總結(jié):
            理解業(yè)務(wù)部分,先區(qū)分消息(Msg)和事件(Event)。
            1、消息(Msg):是指線程之間傳遞的數(shù)據(jù)結(jié)構(gòu),即被投遞到線程消息隊列中的數(shù)據(jù)結(jié)構(gòu)。SessionManager主要職責是接收消息,通過消息映射,找到處理該消息的函數(shù),該函數(shù)根據(jù)消息中攜帶的sessionid,找到session對象,調(diào)用該session的消息處理函數(shù)繼續(xù)后續(xù)的處理。
            2、事件(Event):是指被session對象中的狀態(tài)機處理的數(shù)據(jù)結(jié)構(gòu)。該數(shù)據(jù)結(jié)構(gòu),在session的消息處理函數(shù)中通過消息的內(nèi)容拼湊,之后交給狀態(tài)機對象處理,狀態(tài)機對象根據(jù)事件類型,通過事件映射,找到處理該事件的函數(shù),繼續(xù)該事件的處理。
            3、代碼流程:一般情況下(邏輯控制部分)其它線程不能直接調(diào)用session對象,正確的調(diào)用方式是發(fā)消息SessionManager,SessionManager根據(jù)消息找到session對象再進行后續(xù)處理。
            4、代碼要寫的足夠呆板。
               寫出好的系統(tǒng)關(guān)鍵在于對業(yè)務(wù)的理解,不在于對代碼技巧的玩弄。

             

            posted on 2008-12-22 14:27 cppexplore 閱讀(4577) 評論(6)  編輯 收藏 引用

            評論

            # re: 【原創(chuàng)】技術(shù)系列綜述(三) 2008-12-23 10:57 kacy16
            非常謝謝cppexplore無私的把自己實際經(jīng)驗無私的分享,感覺這些思路(經(jīng)驗)都非常的實用,考慮到了實際情況的擴展性,效率等各方面,不像一些書本的資料夸夸其談,提供的思路要不全是抽象的理論,要不就是一整個花架子(就像小孩過家家的玩意).非常謝謝!  回復  更多評論
              

            # re: 【原創(chuàng)】技術(shù)系列綜述(三) [未登錄] 2008-12-23 21:19 cppexplore
            @kacy16
            :)  回復  更多評論
              

            # re: 【原創(chuàng)】技術(shù)系列綜述(三) 2009-04-01 11:30 中國兄弟連
            給你踩踩哈  回復  更多評論
              

            # re: 【原創(chuàng)】服務(wù)器技術(shù)系列綜述(三) 2009-12-26 05:38 浩毛
            拒絕線程,珍愛生命  回復  更多評論
              

            # re: 【原創(chuàng)】服務(wù)器技術(shù)系列綜述(三) 2010-04-13 16:05 zhaojx
            大牛,我剛畢業(yè)一年,工作中的很多內(nèi)容在你的文章里都有,你的文章真的是總結(jié)到我的心坎里了,好多東西都是這么熟悉,但是就是因為自己沒有總結(jié),看了你的文章,真的是頗有收獲,希望你能繼續(xù)寫下去  回復  更多評論
              

            # re: 【原創(chuàng)】服務(wù)器技術(shù)系列綜述(三) [未登錄] 2010-04-13 16:48 cppexplore
            @zhaojx
            很高興你能喜歡我寫的內(nèi)容, :)   回復  更多評論
              

            国产精品免费久久| 国产成人无码久久久精品一| 精品久久久久久99人妻| 久久一本综合| 日本久久久精品中文字幕| 久久这里有精品视频| 99999久久久久久亚洲| 欧美激情精品久久久久久久九九九| 国产亚洲美女精品久久久2020| 国内精品久久久久| 久久这里只精品99re66| 国产精品一区二区久久| 污污内射久久一区二区欧美日韩| 久久国产色AV免费看| 欧美亚洲国产精品久久久久| 94久久国产乱子伦精品免费| 日本强好片久久久久久AAA | 亚洲国产精品无码久久久久久曰| 亚洲精品国产美女久久久| 久久人人超碰精品CAOPOREN| www.久久精品| 久久久久亚洲av无码专区导航| 欧洲性大片xxxxx久久久| yellow中文字幕久久网| 九九99精品久久久久久| 欧美噜噜久久久XXX| 久久九九兔免费精品6| 四虎亚洲国产成人久久精品| 国产精自产拍久久久久久蜜| 欧美久久综合性欧美| 久久国产精品无码HDAV| 国产精品美女久久久m| 久久久国产乱子伦精品作者| 亚洲国产精品无码久久久蜜芽| 久久只有这精品99| 久久久久久久免费视频| 久久久久青草线蕉综合超碰| 伊人久久大香线蕉综合Av| 伊人久久大香线蕉亚洲| 色欲久久久天天天综合网精品 | 亚洲国产精品一区二区久久|