通用網(wǎng)絡(luò)服務(wù)器的設(shè)計思路
1. 設(shè)計目標(biāo):
? 高性能,高擴展性,的網(wǎng)絡(luò)服務(wù)器的底層框架。可能有人會問C++有了ACE庫,而且現(xiàn)在ACE也已經(jīng)移植到了Java上去了還需要你這個框架嗎?我想說的是我的這個框架是基于ACE之上的。對于某種網(wǎng)絡(luò)服務(wù)器實現(xiàn)的抽象。ACE提供的是將功能與系統(tǒng)底層具體實現(xiàn)的隔離的infrastructure 級別的框架。而我的這個服務(wù)器框架提供的是一種半成品的網(wǎng)絡(luò)服務(wù)器。只有實現(xiàn)某些狀態(tài)接口,回調(diào)接口就是一個完整的網(wǎng)絡(luò)服務(wù)器.?
2.原始動機:
?最開始寫服務(wù)器端的程序之時處理用戶并發(fā)就是采用多線程的方式,每個用戶聯(lián)接用一個線程維護。對于小并發(fā)量,小負荷的服務(wù)器而言這樣設(shè)計最為簡單直觀。可是對于大并發(fā)處理量的服務(wù)器而言派生大量的線程單單線程間的context切換的處理量就已是相當(dāng)驚人了。更何況OS線程數(shù)量的上限以及線程本身消耗的OS內(nèi)核資源都使得線程模式的服務(wù)器不具備良好的擴展性。因此我們會用select的網(wǎng)絡(luò)事件的機制來用一個線程來為多個并發(fā)用戶服務(wù)。這樣做帶來的開發(fā)上的區(qū)別不僅僅是轉(zhuǎn)換API那么簡單。因為換用了采用網(wǎng)絡(luò)事件來驅(qū)動程序,一個用戶的處理不再可以一條線由頭處理到尾了。收到讀事件后還需要當(dāng)前用戶的狀態(tài)才知道下一步的處理。程序邏輯越復(fù)雜狀態(tài)也越多。如何在一個網(wǎng)絡(luò)服務(wù)器框架中將這些復(fù)雜的狀態(tài)遷移機制封裝起來。用一些簡單的描述文件+接口實現(xiàn)就可以組裝出一臺網(wǎng)絡(luò)服務(wù)器這就是我的設(shè)計要解決的問題。目前這個原型是用java NIO來實現(xiàn)的。計劃C++版本就用ACE作底層
3.目前狀態(tài):
?對于java NIO的探索階段已經(jīng)完成,也構(gòu)造了基本的原型。現(xiàn)在的新的設(shè)計思路就是并發(fā)多個selector線程,Socket Channel 讀操作以及一些不耗時的狀態(tài)效驗的操作都在selector線程中完成。其余與IO無關(guān)的耗時的邏輯都由另外一個線程池中的線程來完成.
posted on 2006-05-16 14:20 勤天 閱讀(251) 評論(0) 編輯 收藏 所屬分類: 設(shè)計收集站