服務器模式

  服務器開發貌似有固定的模式,性能和複雜度各異,現總結下常見的模式。固然服務器的開發並無固定的模式,除了如下總結的外,實際根據業務的不一樣,生產中還用過其餘模式。前端

    1. 阻塞式服務器
      主要特色:一個鏈接上來,等服務完畢後,才釋放鏈接,在服務過程當中,不能接收其餘鏈接。通常而言此類服務的socket通常是阻塞的。此類服務器通常性能比較低的,基本上生產上不會用這種模式,只有在學習或作一些簡單的測試纔會使用這些模式。linux

    2. 迭代式服務器
      主要特色:一個鏈接上來,fork一個進程或建立一個線程進行服務,在一個服務的過程當中,能夠同時服務多個鏈接。通常來講,此類服務socket通常也是阻塞的。此類服務通常性能會比阻塞式服務器高不少,也有不少公司用這種模式,好比kugou的服務端。若是鏈接數比較大,C10K問題就很是明顯,隨着鏈接數的增長,性能劇烈降低。並且若是基本上是短鏈接的話,主動關閉會出現大量的TIMEWAIT或CLOSINGWAIT狀態。nginx

    3. 資源池的服務器 主要特色:預先啓動必定數量的線程或進程,啓動的數量根據實際的狀況啓動。每一個鏈接來時,分配到空閒的線程或進程,也能夠根據實際狀況一個線程或進程處理多個鏈接業務,當沒法找到空閒進程或線程時,能夠動態增長線程或進程,socket能夠是阻塞或非阻塞的。這類服務器須要預先估計服務器的承載能力。也有比較多的公司使用這種模式。固然會根據實際狀況進行一些變化,好比說在服務器接一個前端,將前端的報文分發到消息隊列,多個進程或線程競爭搶着處理。但本質上就是資源池的概念。nginx 貌似也是這種模式的,nginx還有一個先進的地方是多個進程同時linsten一個fd,linux是容許多個進程同時監聽一個端口的,當一個進程accept成功時,其餘進程accept也會返回,這是羣驚效應。本身不少年前也曾實現相似的服務器框架。jmmgit

    4. 非阻塞無狀態服務器
      主要特色:通常都是單進程,採用epoll多路服務,對於動態數據,通常存在redis或一些分佈是緩存中。一個進程能夠接受多個鏈接,同時服務。當遇到性能瓶頸時,能夠隨便增長進程。通常這類服務器前端還可能接負責均衡器。如今通常都用這模式進行開發,性能比較可觀,並且擴展很是方便。github

        1. http://luoguochun.cn/2014/06/25/server-mode/
相關文章
相關標籤/搜索