1. 程式人生 > >基於selector的源碼分析和理解、思想和應用實踐

基於selector的源碼分析和理解、思想和應用實踐

讀寫 阻塞 con 請求 com inf 精華 循環 序列化

來自京東架構師(JAVA)歡迎關註我的微信公眾號java2arch,更多技術文章可看。

一個連接請求connetion request過來,產生一個通道channel(包含並封裝了connection),channel註冊到selector的set集合環上,服務端主線程死循環while(true)獲取channel(有事件的,如枚舉可讀、可寫、連接、連接就緒),根據事件枚舉switch分支判斷,通過獲取的channel讀請求數據、寫響應數據、發送心跳回應、記錄日誌等等。

客戶端與服務端建立連接獲得單個channel,可以讀寫數據。

技術分享圖片

精華思想:面對高並發的客戶端連接和數據傳輸,服務端主線程不需要阻塞等待建立連接、讀寫數據等,通過註冊通道事件驅動異步處理高並發的讀寫等操作。請求來了,先放到環形集合裏,有讀寫數據了,告訴我我再來處理,在這之前,我可以幹別的事情或休息,不是站著在門口幹等。在進一步,主線程就是老板,來活了告訴老板,老板來了,可以分配給其他小廝做,這樣效率和吞吐量就比老板一個人幹要強多了吧。boss->woker模型,worker可以是線程池驅動的。netty.使用了事件驅動、異步、多線程高並發的技術和思想。另外呢,考慮引進AIO和零拷貝以及channe責任鏈式的處理handle和filter\chain機制,引入高效序列化、網絡心跳保持防火墻開放技術、解決分包、粘包、丟包、以及安全的策略和機制。

基於selector的源碼分析和理解、思想和應用實踐