日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EDA风格与Reactor模式

發布時間:2024/7/23 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EDA风格与Reactor模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:https://www.cnblogs.com/ivaneye/p/10129896.html

本文將探討如下幾個問題:

  • Event-Driven架構風格的約束
  • EDA風格對架構屬性的影響
  • Reactor架構模式
  • Reactor所解決的問題
  • redis中的EventDriven

從觀察者模式到EDA風格

GOF的23種設計模式中,有一個觀察者模式!個人覺得叫「監聽模式」更合理!

定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴于它的對象都得到通知并被自動更新。

它和EDA風格有些類似!不過一個應用在代碼關系層面;一個應用在架構上!

在EDA中,有三個必要組件:

  • 事件生產組件:對應到觀察者模式中,就是引起Subject狀態變化的對象。它引起Subject狀態變化的動作就是事件。
  • 事件隊列:對應到觀察者模式中,就是Subject對象。事件生產者產生的事件,會到事件隊列中。
  • 事件處理組件:處理事件生產組件所產生的事件。對應到觀察者模式中,就是Observer對象。

EDA風格的約束

  • 「事件生產組件」產生事件,將其添加到「事件隊列」中
  • 「事件處理組件」監聽「事件隊列」
  • 當「事件隊列」中有自己能處理的事件時,「事件處理組件」將對該事件進行處理
  • 「事件處理組件」處理完事件后,可以將處理結果返回給「事件生產組件」,也可以不返回
  • 「事件生產組件」可以接收「事件處理組件」處理結果,也可以不接收

EDA風格可以細分為Mediator結構和Broker結構!

  • Mediator結構通過一個Mediator組件協調多個步驟間的關系和執行順序
  • Broker結構則是通過松散的方式來組織多個步驟之間的關系和執行順序

Mediator結構如下:

在Mediator結構中主要有四個組件:

  • 事件隊列(event queue)
  • 事件中介(event mediator)
  • 事件通道(event channel)
  • 事件處理器(event processor)。

執行流程如下:

  • 「事件生產組件」產生事件,將其添加到「事件隊列」中
  • 「事件中介」監聽「事件隊列」
  • 當「事件隊列」中有事件時,「事件中介」根據具體的事件,將其拆分/組合為一步步的具體步驟
  • 將具體的步驟添加到對應的「事件通道」中
  • 「事件處理器」從「事件通道」中獲取到事件,進行處理

Broker結構如下:

Broker結構中主要包括兩個組件:

  • Broker:Broker可被集中或相互關聯在一起使用,此外,Broker中還可以包含所有事件流中使用的事件通道。
  • 事件處理器

執行流程如下:

  • 「事件生產組件」產生事件,將其添加到「Broker」中
  • 「事件處理組件」監聽「Broker」
  • 當「Broker」中有自己能處理的事件時,「事件處理組件」將對該事件進行處理
  • 「事件處理組件」處理完事件后,發送后續事件到「Broker」中
  • 其它「事件處理組件」接收到自己能處理的事件后,對該事件進行處理,處理完后,可能繼續發送事件到「Broker」中
  • 當不再有后續事件時,所有步驟完成

EDA風格對架構屬性的影響

  • 性能:由于EDA是個異步架構,對于不需要返回值的請求,它能明顯的提高用戶可感知的性能。
  • 擴展性:事件生產者和事件消費者松耦合,可以獨立進化,可以方便的進行功能擴展。同時由于,可以方便的添加事件消費者,故而進一步提高了擴展性。
  • 伸縮性:事件生產者和事件消費者松耦合及可以方便的添加事件消費者,使得EDA有很好的伸縮性
  • 可維護性:事件生產者和事件消費者松耦合,且和一般的調用方式相比,在理解上有一定的難度,使得開發難度增加,但單元測試較方便。而由于EDA的異步性,使得集成測試比較麻煩。可維護性一般
  • 可運維性:事件生產者和事件消費者松耦合,可獨立部署,可運維性相對較容易
  • 靈活性:高度可擴展,易于伸縮使得EDA有較高的靈活性

Reactor架構模式

Reactor架構模式,是EDA風格的一種實現!它是為了處理:

  • 高并發IO請求
  • 其中請求所包含的數據量不大
  • 每個請求處理耗時不長

Reactor模型,有四個組件:

  • Acceptor:Acceptor接受Client連接。屬于EDA「事件隊列組件」。
  • Channel:接收IO事件。屬于EDA「事件隊列組件」。
  • Reactor:監聽Channel和Acceptor,當發生連接事件或IO事件時,將其派發給對應的Handler。屬于EDA「事件隊列組件」。
  • Handler:和一個Client通訊的實體,進行實際的業務處理。對應EDA的「事件處理組件」。

Client屬于EDA的「事件生產組件」!

Reactor可以分為:單線程模型,多線程模型和主從Reactor模型

  • 單線程模型

Reactor輪詢到消息后,就直接委托給Handler去處理,處理完后,再進行后面的輪詢,即一個Handler處理完之后,才能進行下一個Handler的處理!如果某個handler耗時較長,就會阻塞后續的handler的執行!

  • 多線程模型

Reactor多線程模型就是將Handler中的IO操作和非IO操作分開,操作IO的線程稱為IO線程,非IO操作的線程稱為工作線程!這樣的話,客戶端的請求會直接被丟到線程池中,客戶端發送請求就不會堵塞!

但是當用戶進一步增加的時候,Reactor會出現瓶頸!因為Reactor既要處理IO操作請求,又要響應連接請求!為了分擔Reactor的負擔,所以引入了主從Reactor模型!

  • 主從Reactor模型

主Reactor用于響應連接請求,從Reactor用于處理IO操作請求!

詳細內容可參考之前的博文《高性能Server---Reactor模型》!

這里簡單說下,為什么Reactor中,請求的數據量不能太大,請求處理時間為什么不能太長!

其實很好理解,如果請求數據量太大、處理時間很長!即使是主從Reactor模型,線程池也會被耗盡!耗盡后,導致后續的請求積壓。

Reactor解決的是傳統BIO模型下,Server并發處理請求的能力受限于系統所能創建的線程數的問題!

redis中的EventDriven

redis使用了「Event-driven programming」來處理指令,「Event-driven programming」是一種編程范式,也可以說是EDA的代碼實現。redis中的實現,類似Reactor單線程模型!

事件驅動程序設計是一種計算機程序設計模型。與傳統上一次等待一個完整的指令然后再做運行的方式不同,事件驅動程序模型下的系統,基本上的架構是預先設計一個事件循環所形成的程序,這個事件循環程序不斷地檢查目前要處理的信息,根據要處理的信息運行一個觸發函數進行必要的處理。其中這個外部信息可能來自一個目錄夾中的文件,可能來自鍵盤或鼠標的動作,或者是一個時間事件。

簡單的看一下代碼:

// server.cint main(int argc, char **argv) {......aeMain(server.el); // 進入事件監聽輪詢,輪詢注冊上來的文件句柄...... }// ae.cvoid aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0; // eventLoop相當于Reactor模式中的Reactor組件while (!eventLoop->stop) {if (eventLoop->beforesleep != NULL)eventLoop->beforesleep(eventLoop);aeProcessEvents(eventLoop, AE_ALL_EVENTS|AE_CALL_AFTER_SLEEP);} }int aeProcessEvents(aeEventLoop *eventLoop, int flags) {......numevents = aeApiPoll(eventLoop, tvp);// select,epoll,evport,kqueue底層實現,獲取事件......// 將事件委托給具體的Handler去處理for (j = 0; j < numevents; j++) {aeFileEvent *fe = &eventLoop->events[eventLoop->fired[j].fd];int mask = eventLoop->fired[j].mask;int fd = eventLoop->fired[j].fd;int fired = 0; int invert = fe->mask & AE_BARRIER;if (!invert && fe->mask & mask & AE_READABLE) {fe->rfileProc(eventLoop,fd,fe->clientData,mask);fired++;}if (fe->mask & mask & AE_WRITABLE) {if (!fired || fe->wfileProc != fe->rfileProc) {fe->wfileProc(eventLoop,fd,fe->clientData,mask);fired++;}}if (invert && fe->mask & mask & AE_READABLE) {if (!fired || fe->wfileProc != fe->rfileProc) {fe->rfileProc(eventLoop,fd,fe->clientData,mask);fired++;}}processed++;}...... }// ae.h // aeFileEvent的結構如下,在構建時,就將處理程序賦給了其中的aeFileProc // 在上面的輪詢中,直接取出來執行即可 typedef struct aeFileEvent {int mask; /* one of AE_(READABLE|WRITABLE|BARRIER) */aeFileProc *rfileProc;aeFileProc *wfileProc;void *clientData; } aeFileEvent;

下面以我們啟動redis-server和redis-cli這個流程,來簡單的說明下redis的執行流程:

//redis-server啟動后,進入輪詢狀態,等待事件 //啟動時構建了一個tcpHandler,用于處理客戶端連接// server.c for (j = 0; j < server.ipfd_count; j++) {if (aeCreateFileEvent(server.el, server.ipfd[j], AE_READABLE,acceptTcpHandler,NULL) == AE_ERR){serverPanic("Unrecoverable error creating server.ipfd file event.");} }//redis-cli啟動后,eventLoop輪詢到連接事件,觸發tcpHandler,根據獲取到的文件句柄,構建aeFileEvent,同時設置readQueryFromClient Handler,用于處理后續的客戶端的指令 client *createClient(int fd) {......if (aeCreateFileEvent(server.el,fd,AE_READABLE,readQueryFromClient, c) == AE_ERR){close(fd);zfree(c);return NULL;}...... }// 客戶端發送指令后,觸發readQueryFromClient Handler,來處理指令 // 處理完后,等待下一個指令

參考資料

  • Event-driven architecture
  • Event-driven architecture
  • Reactor pattern
  • 《Software Architecture Patterns》Mark Richards
  • Event-driven programming
  • Redis源碼
  • 《恰如其分的軟件架構》

?

?

?

總結

以上是生活随笔為你收集整理的EDA风格与Reactor模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 奇米影视9999 | 波多野结衣中文字幕一区 | 动漫精品一区一码二码三码四码 | 动漫玉足吸乳羞免费网站玉足 | 欧美日本一本 | 久久精品视频5 | 黄色片欧美| 国产爆乳无码一区二区麻豆 | 五月激情婷婷在线 | 天天操天天射天天爱 | 亚洲性在线 | 波多野结衣丝袜 | 国产视频h | 免费福利在线视频 | 在线不卡中文字幕 | 自拍偷自拍亚洲精品播放 | 日韩一卡| 一级一片免费看 | 亚州av| 日韩一级片 | 精品国产一级久久 | 粗了大了 整进去好爽视频 日本女优中文字幕 | 欧美性大战久久久久久 | 精品人伦一区二区三区 | 久草网在线观看 | 大香伊人久久 | 双腿张开被9个男人调教 | 97视频免费在线 | 久久成人动漫 | 丰满人妻一区二区三区性色 | 白丝一区| 天堂影院一区二区 | 精品久久网站 | 中文字幕激情小说 | 嫩草在线看 | 国产毛片毛片毛片毛片毛片毛片 | 日本一区二区视频在线播放 | 亚洲黄色网络 | 色先锋av | 久久久青青草 | 欧美黄色视屏 | 亚洲一区二区在线免费 | 色综合久久久久 | 影音先锋中文字幕在线播放 | 欧美日韩精品一区二区在线播放 | 黄污视频网站 | 久久久久久久久艹 | 成人av在线网址 | 噜噜噜久久,亚洲精品国产品 | 相亲对象是问题学生动漫免费观看 | 国产又粗又大又长 | 日本免费黄色小视频 | 欧美成人亚洲 | 九色在线视频 | 美女脱了裤子让男人桶 | 午夜天堂精品久久久久 | 亚洲精品中文字幕在线 | 国产经典一区二区 | 久久亚洲精品小早川怜子 | 欧美人在线 | 欧美成人精品网站 | 亚洲另类在线观看 | 综合五月 | 免费小视频 | 玖玖爱免费视频 | 亚洲国产成人va在线观看天堂 | 国产真人做爰毛片视频直播 | 日本大胆裸体做爰视频 | 999久久久精品视频 亚洲视频精品在线 | 国产无码精品视频 | 欧美一区二区三区成人 | 邻居少妇张开腿让我爽了在线观看 | 午夜免费视频观看 | 欧美日韩天堂 | 91蜜桃婷婷狠狠久久综合9色 | 老司机深夜免费福利 | 97在线免费观看视频 | 欧美一区二区三区在线观看视频 | 不卡久久 | 亚洲第一成人网站 | 在线高清观看免费观看 | 色婷婷av久久久久久久 | 日本不卡一区在线 | 每日更新av | 先锋av资源在线 | 精品成人网 | 五月激情片 | 国产精品永久久久久久久久久 | 日韩激情图片 | 免费古装一级淫片潘金莲 | 亚洲三级a| 一区二区三区黄色片 | 国产精品一色哟哟哟 | 在线观看波多野结衣 | 天天av天天翘 | 日本特级黄色 | 成人国产综合 | 国产香蕉av | 日韩一区在线免费观看 |