KonsanNet 網絡通信框架 V0.7 更新

簡述

       一年過去,忙碌而多煩憂,多在管理和處理線上故障上,能沉下心寫代碼的時間少,所以開源就更顧不上了,間隔或修改一二,但都無閒暇做完整測試,也無更新。

       近來,有些空餘,也因一項目需要,把通信框架修改了不少,昨天發佈,現做簡單的闡述。

       本次版本姑且稱Version 0.7吧,於我心中,還缺不少模塊,也缺一些功能,離大規模高質量傳輸還有些距離,雖然已經不錯(得自誇下^_^),但離對實時性和延遲要求高的場景,還需要多應用和改進,框架已經搭建起來了,但是細節性能的優化,那所涉甚多,得慢慢調優。

      對於功能和模塊,還缺少很多東西,比如P2P,比如通信網關轉發,比如像protocol buf一樣的便捷配置工具和包對象測試框架,前路慢慢。

      對於便捷實用,還需要不少時間去增加,比如框架的參數配置和熱加載,比如使用說明,比如快速配置RPC對象等等,來日方長啊。

 

源碼地址

       GitHub:https://github.com/KonsanAlide/KonsanNet

 

更新內容

CXCommon 

包結構修改

       修改了包結構,在CXPacketBodyData中增加了RPC對象的GUID和包的GUID,RPC對象的GUID用於訪問PRC對象時產生、訪問、銷燬一種RPC對象,包的GUID就是用於標識從該請求發起到最終反饋回到發起方的整個鏈路的會話ID,用於分析追蹤和定位請求在傳輸處理中發生的問題。爲了更方便快速的解決使用中遇到的問題,只能犧牲點帶寬和性能,兩個GUID總增加了32個字節,也就是v0.7後,每個消息包比以前增加32個字節長度。

       如有同學在實際使用中,爲了帶寬考慮,無需使用RPC也無需使用包GUID,依然希望使用以前的通過包編碼來通信的方式,可以修改如下:

  1. 修改CXCommon/include/CXCommonPacketStructure.h文件中的CXPacketBodyData定義,把byObjectGuid和byPacketGuid兩個數組去除。
  2. 然後把CXCommunicationClient和CXCommunicationServer裏面使用到byObjectGuid和byObjectGuid的地方的邏輯進行修改,主要是CXMessageProcessLevelBase::ProcessMessage()函數,可以參考V0.61版本的代碼來修改,以及修改CXTcpClient::SendPacket函數,把兩個GUID去除。

 

增加RPC對象映射定義

       在CXCommon/include/CXPacketCodeDefine.h中增加了const map<string, string> g_mapRPCObjectGuid,用於標識RPC對象的名稱和GUID的映射,後面版本會修改成管理庫。

       新同學構建自己的RPC對象的過程中需要把對象的名稱和GUID填寫到該map中,用於程序內部根據該map來創建對應的RPC對象。

 

增加GUID的簡單封裝類

       在CXCommon中增加了CXGuidObject,用於對windows和linux的guid進行簡單的封裝,用於便捷實用。

CXCommunicationClient 

RPC對象功能

       增加了RPC對象的客戶端基類CXRPCObjectClient,用於統一RPC對象的基本函數和隱藏底層通信接口,以便繼承使用。

Bug修正

  1. 修正了CXFileTcpClient::Write函數中使用了CXTcpClient的發送緩衝來直接寫入數據(爲了減少一次內存複製)產生的緩衝地址和長度計算出錯的問題。
  2. 在CXFileTcpClient::Write函數中增加seek位置和方向參數,對於文件寫入,如果寫入之前需要重新定位,那麼無需再調用一次CXFileTcpClient::Seek函數,直接用CXFileTcpClient::Write函數可以一次完成尋位並寫入的功能(服務端CXFileRPCServer對象支持該功能處理)。
  3. 補漏CXTcpClient的析構函數未關閉通信、清理緩存指針和釋放內存的問題。

CXCommunicationServer 

RPC對象功能

       增加了RPC對象的服務端基類CXRPCObjectServer,用於統一RPC對象的基本函數和隱藏底層通信接口,以便繼承使用。修改CXMessageProcessLevelBase::ProcessMessage()的處理邏輯,從原來根據包號碼來進行分派消息包並處理的邏輯改成根據RPC對象GUID來調用RPC對象的方法進行處理。

拆包優化

       優化了CXConnectionObject::RecvPacket函數中拆包處理過程,簡化了一些邏輯。

連接管理

       在CXConnectionsManager中增加連接超時管理,如果長時間沒有收到心消息包或者心跳包,那麼服務端會把該連接關閉,目前超時時間通過CXConnectionObject::m_dwTimeOutMSeconds屬性來修改,後期版本會增加通過外部的配置文件來進行配置。

       在CXConnectionsManager中增加連接關閉後對象延遲迴收功能,在CXConnectionsManager::DetectConnections()中實現,實現當一個連接已經被完全關閉2000毫秒後會被增加到複用隊列m_queueFreeConnections中,以便新接收的連接使用。

 

會話管理

       簡少CXSessionsManager中的鎖,簡化會話關閉和回收邏輯。

解密和解壓線程緩存管理

       爲了更高效高速的使用內存,在CXSocketServerKernel::WaitThread()中增加了一個10MB緩存(消息包最大隻能爲10MB),用於消息包的解密和解壓,無需在消息包的解密和解壓時再動態從緩存池裏面申請新內存。

引入C++11的chrono時間庫

       引入C++11的chrono時間庫用於計算毫秒和納秒級別的時間戳和間隔,也就是以後CXCommunicationServer工程必須使用C++11,如在低版本的Linux系統下編譯,需要升級gcc和g++版本。

增加請求耗時輸出

       引入Journal log,在CXMessageProcessLevelBase::ProcessMessage()中增加請求處理耗時輸出,後期版本會在journal日誌裏面增加更像詳細的包內容格式化輸出。

Bug修正

  1. 修正連接和會話關閉時的一些bug,讓會話和連接對象可以再次安全複用。
  2. 修正Linux平臺CXConnectionObject::SendData發送數據時遇到EAGAIN時處理出錯的問題。
  3. 去除幾個多餘的類對象。

CXEvent 

Bug修正

  1. 修正了CXEvent::WaitForSingleObject中Linux下計時單位出錯導致等待時長不對的問題。

CXFile 

Bug修正

  1. 修正了CXFile64::Open函數中打開已經存在的設備寫入的報錯問題。
  2. 修正了CXFile64::Seek中獲取設備的大小出錯導致Seek出錯的問題。
  3. 修正了CXFile64::Close() linux下漏掉return和復位m_file和m_bIsOpened的問題。

CXMemoryCache

增加內存池的彈性伸縮

       增加一個CXElasticMemoryCache類來實現一種大小的內存池的伸縮機制,CXMemoryCacheManager裏面來增加線程進行閒時內存池回收。

修改優化內存池管理性能

       修改CXMemoryCacheManager中內存池的管理,使內存申請和釋放更快速。

CXLog

修改日誌寫入線程立刻刷盤爲定期刷盤

       原來的日誌寫入的線程,當寫入一條日誌到文件的時候,直接flush,現在改成1秒鐘flush一次。

輸出毫秒級日誌時間

       在Log()函數裏面增加毫秒時間的輸出,以更精確的定位日誌產生時間。

 

CXThread

Bug修復

      修正CXThread::Start()中m_pThreadPara = pThreadPara在線程創建之後,導致指針引用報錯問題。

 

 

其它

後面短期內的版本會增加如下功能:

  1. RPC對象的消息處理後把消息格式化輸出到journal 日誌
  2. 增加CXConnectionObject發送隊列和發送線程,把windows的socket改成異步通信。
  3. 增加轉發到第三方的邏輯,創建新的socket,產生CXConnectionObject並增加到epoll和iocp發送接收數據。
  4. 增加數據發送到第三方後,返回時的消息處理。
  5. 增加服務端的各模塊參數外部配置和熱加載
  6. 增加像protocol buf那樣的便捷的產生包結構和測試的庫。
  7. 選擇合適的加密算法和壓縮算法增加加解密和壓縮解壓處理。
  8. 增加消息處理耗時統計。
  9. 增加消息處理超時處理。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章