日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现

發布時間:2025/1/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近開始看Tair的源碼實現,Tair的通信使用的是淘寶的開源的網絡庫tbnet實現。具體來說是依靠tbnet::Transport類型實現,其源代碼路徑如下:
http://code.taobao.org/svn/tb-common-utils/trunk/tbnet/src
下面介紹其通信流程:
1. 啟動
Transport::start()完成其啟動,主要工作是啟動了兩個線程:_readWriteThread和_timeoutThread.?這兩個線程的實際入口函數式Tranport::run(),?下面是Transport::run的實現:

?

?

  • void Transport::run(tbsys::CThread?*thread,?void?*arg)?{
  • ????if?(thread?==?&_timeoutThread)?{
  • ????????timeoutLoop();
  • ????}?else?{
  • ????????eventLoop((SocketEvent*)arg);
  • ????}
  • } ?
  • ?

    ????A.?讀寫線程:
    ????????1. 讀寫線程使用epoll實現,在Transport中存在一個EPollSocketEvent _socketEvent 成員變量, arg傳入的是這個成員變量的指針,EPollSocketEvent是epoll個操作的封裝,在EPollSocketEvent的構造函數中會調用epoll_create初始化epoll。
    ????????2. eventLoop的實現步驟如下:
    ????????????????a.? 調用socketEvent->getEvents()?取得發生的事件并放入到ioevents數組中
    ????????????????????????i.??調用epoll_wait等待讀寫事件;
    ????????????????????????ii.?每個事件的events[i].data.ptr存放有事件對應的IOComonet(socket 封裝),可以用來處理讀寫事件;
    ????????????????b.??對于讀寫事件,分別調用ioc->handleReadEvent()和ioc->handleWriteEvent()處理;
    ????
    ????B. timeout線程
    ????????1. 主要用于檢查通信的socket是否超過一定時常沒有使用,對于TCPComponent(封裝通信socket),如果15分鐘沒有使用,則斷開連接;

    2. 監聽
    通過調用Transport::listen()完成監聽,?主要完成以下步驟:
    ????a.??創建TCPAcceptor,繼承于IOComonet(socket 封裝),并啟動異步監聽;
    ????b.?調用addComponent(acceptor, true, false);
    ????????????i.??創建epoll_event ev,設置ev.data.ptr = socket->getIOComponent(),用來處理讀寫事件的IOComponentsocket 封裝)
    ????????????ii.?調用epoll_ctl(_iepfd,EPOLL_CTL_ADD,socket->getSocketHandle(),&ev)注冊監聽socket上的讀取事件;
    ????c. 當客戶端有connect請求過來的時候會觸發監聽socket上的讀取事件,TCPAcceptor::handleReadEvent()會被調用。

    3. 接受客戶端的連接請求
    系統在TCPAcceptor::handleReadEvent()中接受客戶端的連接請求,主要步驟如下:
    ????a. socket = ((ServerSocket*)_socket)->accept()?接受連接請求并得到通信socket;
    ????b.?創建TCPComponent封裝通信socket;
    ????c.?調用addComponent(component, true, false) 注冊當前socket的讀取事件。

    4.?數據通信
    ????A.?數據讀取
    ?????????數據通信由通信socket完成,該socket在epoll中注冊,當有數據需要讀取的時候會觸發讀取事件并調用TCPComponent::handleReadEvent()處理。
    ????B.?數據發送
    ?????????當有數據需要發送時Connection::postPacket()函數,?這個函數中會調用_iocomponent->enableWrite(true),注冊寫入事件,并調用TCPComponent::handleWriteEvent()處理。

    轉載于:https://www.cnblogs.com/ranran/p/taobao_tongxin.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的双11怎么那么强!之二:浅析淘宝网络通信库tbnet的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。