今天嘗試使用Selector改造轉發邏輯,結果可恥的失敗了!由於Selector不是線程安全的,試圖多個線程進行register會致使嚴重的問題,這也是爲何基於事件的IO模型都不怎麼支持多線程的緣由,太難作了。緩存
後來嘗試用Java的Future機制來實現超時。咱們知道,Java的FutureTask須要一個執行的線程池。若是每次都new出來固然沒有問題,可是經測試性能開銷較大(qps被降到了4000)。後來嘗試複用同一大線程池,發現請求多了以後,老是會超時!安全
而後jstack查看發現,不少線程仍然卡在了Callable.call方法,就是咱們常說的異常把線程拋死了!原來TimeoutException也會致使線程拋出異常可是沒法回收。解決方法:使用future.cancel()。多線程
這也說明,線程拋出異常死掉時,jstack查看到的是它拋出異常時的執行棧。架構
加入超時機制後,程序算是穩定了,這週末弄個1.0版吧,之後開始寫ReleaseNotes。函數
今天看了一下代碼,做爲一個開源項目,彷佛風格不是那麼優雅,不少長函數,註釋也不完整。頂多對架構和原理感興趣,代碼的OOP神馬的,這方面徹底提不起興趣來啊。性能
在本身的MBP上也編譯了一個queryperf,測試性能達到55000qps,而攔截模式只有35000,果真仍是緩存byte[]更給力啊。所以把攔截模式也加入了cache。測試