2009-09-28 46 views
0

好的,我知道這很寬泛,但讓我縮小一點。我已經完成了一些客戶端 - 服務器編程,但是一次只能處理幾個客戶端。所以我在設計方面想知道這些服務器最主流的方法是什麼。如果人們可以參考教程,書籍或電子書。 哈哈好的。並沒有真正縮小它的範圍。我想我要找的是服務器端程序如何設置的一個簡單但實​​際的例子。 我看到它的方式:客戶端發送命令:服務器接收命令並放入隊列中,服務器有一個專用線程或一個不斷輪詢該隊列的線程池,然後將適當的響應發送回客戶端。是否經常使用非阻塞I/O? 我想只是教程,時間和練習是我真正需要的。什麼是設計大型服務器程序最常用的方法?

*編輯:謝謝你的迴應!這裏有一點我想要做的,我想。 這主要是爲了學習的目的,所以我寧願儘量避免使用框架或庫。舉個例子,這有點彌補的想法: 有一個客戶端程序,它執行一些功能,並不斷將輸出流傳輸到服務器(可以有很多這些客戶端),服務器然後創建統計信息並存儲大部分數據。並且假設有一個可以登錄到服務器的管理客戶端,並且如果有客戶端正在將數據流式傳輸到服務器,則它會將該數據傳輸到每個連接的管理客戶端。 這是我的設想服務器程序邏輯: 服務器將具有3個線程,用於管理傳入連接(每個端口一個監聽),則產生線程管理每個連接: 1)ClientConnection這將基本上只是接收輸出,我們只能說是文本 2)AdminConnection這將是服務器和管理客戶機之間發送命令 3)AdminDataConnection這將主要是用於客戶端的輸出流來管理客戶端

當數據從客戶端進來到服務器,服務器解析什麼是相關的,並將這些數據放入隊列中讓我們說adminDataQueue。反過來,有一個線程監視這個隊列,每隔200ms(或其他)檢查隊列,看看是否有數據,如果有的話,然後遍歷AdminDataConnections並將其發送給每個隊列。現在

的AdminConnection,這將是任何命令或數據的直接請求。因此,您可以請求統計數據,服務器端將接收統計數據的命令,然後發送一條說明傳入統計數據的命令,然後立即發送統計數據或統計數據。

至於AdminDataConnection,它僅僅是從客戶端的輸出交織在一起,也許一些簡單的命令。

從所有的客戶端數據的邏輯問題的帶寬問題

除了被漏斗一起給每個管理員客戶端。會從這樣的設計出現什麼樣的問題,是由於縮放問題(再次忽略客戶端和服務器之間的帶寬;管理客戶端和服務器

+0

你能寫出一個用戶故事,以更好地縮小它。這聽起來像你不是在談論一個Web應用程序,而是你自己在寫服務器的地方。 – 2009-09-28 17:41:57

+0

就像電鋸沒有必要比鋼鋸更好?你是否知道數據的性質(更像是銀行交易,你可能會丟失數據,或者更像是你不太在意的遊戲交易),吞吐率,響應時間等。 也許,最好的細節是給我們你簡短的具體用例。 – 2009-09-28 18:02:44

+0

我可以把你指向我的書,但那將是一個完全無恥的插件。 – mtnygard 2009-09-28 22:07:40

回答

2

有幾個基本的方法來這樣做

  • 工人。線程或進程,Apache在大多數多處理模式下都是這樣做的,在某些版本中,當請求到達時會爲每個請求產生一個線程或進程;在其他版本中,有一個等待線程池被分配工作到達(避免叉/線程創建時的開銷的請求到達時)。
  • 異步(非阻塞)I/O和一個事件循環。這基本上是使用UNIX select調用(雖然FreeBSD和Linux都提供了更多優化的替代方案,例如kqueue)。 lighttpd使用這種方法,並且能夠實現非常高的可伸縮性,但是任何服務器內計算都會阻止所有其他請求。並行動態請求處理被傳遞給單獨的進程(通過CGI)或等待進程(通過FastCGI或其等價物)。

我沒有任何特別的引用方便您指出,但是如果你看看網站上的開源項目,使用不同的方法獲取他們設計的信息並不是一個糟糕的開始。

根據我的經驗,建立工作者線程/進程設置在從頭開始工作時更容易。但是,如果你有一個完全與其他通信任務(如數據庫查詢)完全集成的異步框架,它可以非常強大,並且讓你免於一些(但不是全部)線程鎖定問題。如果你使用Python,Twisted就是這樣一個框架。我最近也一直在使用Lwt進行OCaml,取得了很好的成績。

相關問題