//
常見服務(wù)器架構(gòu) - 啊哈的日志 - 網(wǎng)易博客
http://4729469.blog.163.com/blog/static/38971212201311722616119/
這里的服務(wù)器指 client/server 編程中的 server。服務(wù)器常用架構(gòu)包括四種:
- 多線程
- 多進(jìn)程
- 基于 I/O 復(fù)用的事件循環(huán)架構(gòu)
- SEDA 模式
前兩種架構(gòu)適用于類 web 服務(wù)器。這樣的服務(wù)器只需處理來自客戶端的請求,且請求間幾乎是相互獨立的。后兩種架構(gòu)適用于構(gòu)造復(fù)雜的服務(wù)器,比如 Cassandra 系統(tǒng)中的一個節(jié)點,再比如 Redis 服務(wù)器。
多線程服務(wù)器對每個客戶端來的請求生成一個新的線程來服務(wù)它。多進(jìn)程服務(wù)器則生成一個新的進(jìn)程。一個經(jīng)常用的優(yōu)化措施是使用線程池(或進(jìn)程池)。
基于 I/O 復(fù)用的事件循環(huán)就是利用操作系統(tǒng)的 I/O 復(fù)用函數(shù),比如 select, epoll, 采用一個主線程來監(jiān)聽所有的事件(網(wǎng)絡(luò) I/O 事件、timer 事件等),并在這個線程中調(diào)用相應(yīng)的回調(diào)函數(shù)。
基于 I/O 復(fù)用的事件循環(huán)的好處之一是所有事件都在一個線程中處理,就不用考慮非常復(fù)雜的并發(fā)問題,大大簡化了程序。
因為要在主線程中處理所有的事件,所以要求每個事件的處理時間必須要短。如果有些操作非常耗時,那么就要啟動工作線程來處理耗時的操作,工作完成后通知主線程。一般通過管道來解決這個通信問題。(MooseFS 中的 chunkserver 就是這樣做的)
SEDA 這種模式就是把對一個請求的完成過程劃分為多個 stage。每一個 stage 對應(yīng)一個線程池。在前面的一個 stage 完成之后就把請求扔到下一個 stage??梢园阉氤梢粋€流水作業(yè)。
SEDA 這種架構(gòu)使得每個 stage 可以單獨的控制和調(diào)優(yōu),這是它的一個優(yōu)點。 它的缺點在于跨 stage 的控制比較難。 比如如果前一個 stage 的處理時間非常短,后一個 stage 是一個磁盤 I/O stage, 處理時間很長,那么請求就會在后一個 stage 堆積起來;劃分成多個 stage 多,全局的過載控制就比較難。 Cassandra 系統(tǒng)中就有這個問題。