概述
Dubbo線程模型
- IO線程組:負(fù)責(zé)IO流形式監(jiān)聽(tīng)客戶端的所有行為(連接、斷開(kāi)、發(fā)送讀劲弦、寫請(qǐng)求)
- 業(yè)務(wù)線程池:堆積和處理業(yè)務(wù)消息,默認(rèn)fixed醇坝、同步阻塞隊(duì)列邑跪、過(guò)載丟棄等屬性
- dispatcher:任務(wù)調(diào)度器,根據(jù)配置(默認(rèn)all)把IO線程組監(jiān)聽(tīng)到的事件派發(fā)到業(yè)務(wù)線程池呼猪。簡(jiǎn)單的操作画畅,可以直接在IO線程組里做,復(fù)雜和慢的操作必須丟給業(yè)務(wù)線程池宋距,比如數(shù)據(jù)庫(kù)操作夜赵,因?yàn)镮O線程組是 Nio多路復(fù)用一個(gè) Selector 阻塞執(zhí)行的,慢操作會(huì)導(dǎo)致其它請(qǐng)求的處理阻塞乡革。
Dubbo多協(xié)議:
- Dubbo協(xié)議:長(zhǎng)連接寇僧、異步NIO、適合小數(shù)據(jù)高并發(fā)業(yè)務(wù)場(chǎng)景
- Http協(xié)議:短連接沸版,SpringCloud的Feign就是http協(xié)議交互的嘁傀。
- WebService 、Redis视粮、Memcache细办、RMI等等協(xié)議
線程模型
- IO線程:配置在netty連接點(diǎn)的用于處理網(wǎng)絡(luò)數(shù)據(jù)的線程,主要處理編解碼等直接與網(wǎng)絡(luò)數(shù)據(jù)打交道的事件蕾殴。
調(diào)用交互中笑撞,每個(gè)Provider都是一個(gè)Netty的Server端,每個(gè)Consumer都是Neety的Client端钓觉,Netty的Reactor模型中的 woker線程茴肥,就是這里指的IO線程。
每個(gè)Consumer連接成功后都有1個(gè)SocketChannel荡灾,都需要綁定在woker線程池的其中一個(gè)線程中瓤狐,這里的關(guān)系是 1 對(duì)多的瞬铸,1個(gè)IO線程可以綁定N個(gè)consumer的連接,從而實(shí)現(xiàn) 1個(gè)Provider對(duì)N個(gè)Consumer循環(huán)監(jiān)聽(tīng)調(diào)用事件础锐。
所以說(shuō)Dubbo協(xié)議適用于 小數(shù)據(jù)量嗓节、高并發(fā)、服務(wù)提供者遠(yuǎn)小于消費(fèi)者的業(yè)務(wù)場(chǎng)景的原理所在
- 業(yè)務(wù)線程:用于處理具體業(yè)務(wù)邏輯的線程皆警,可以理解為自己在provider上寫的代碼所執(zhí)行的線程環(huán)境拦宣。
這里也可以體現(xiàn)Dubbo協(xié)議框架的安全性,其實(shí)在Server端是具有一定的限流和堆積的作用信姓。不過(guò)這種堆積是堆積在java內(nèi)存中恢着,宕機(jī)數(shù)據(jù)會(huì)丟失
- 防止過(guò)度的Consumer調(diào)用,導(dǎo)致Provider性能不足而宕機(jī)的風(fēng)險(xiǎn)财破。
- 業(yè)務(wù)線程池的飽和策略是直接拋棄且報(bào)錯(cuò),結(jié)合Dubbo的多種重試策略从诲,這個(gè)請(qǐng)求會(huì)很快轉(zhuǎn)發(fā)到其它Provider上左痢,從而提升了響應(yīng)速度,使消費(fèi)的負(fù)載更均衡