ZYSOCKET 第5代異構框架 發布 NEW

2021-09-22 22:27:25 字數 2878 閱讀 1462

nuget:

server link description here

server: pm> install-package zysocketserverv
client link description here

client: pm> install-package zysocketclientv
構架:採用popstack的pipe read 模式,例如 讀取 乙個字串

var str=await fiberrw.readstring(); 

var value=await fiberrw.readint32();

你不需要知道資料報緩衝好了沒,讀到了沒,當它準確讀取到這段資料後,執行緒會返回繼續處理你的邏輯. 你可能會想到 pipe or coroutine

pipe modes: 他是雙向打洞模式

sequencediagram

await read -->> sock.recv:讀取打洞

sock.recv-->>await read:返回打洞

zyv modes:是單項打洞模式,讀取的時候是彈出棧到socket層,socket讀取到資料後使用pipe返回當前的內容上下文繼續執行.內部採用非同步stream模式.方便支援各種流載體比如sslstream,tlsstream,gzipstream..

sequencediagram

await read ->>sock.recv:pop stack

sock.recv -->> await read:返回打洞

以前的zysocket框架採用了 a b模式,當recv到資料報的時候,讀取長度壓入緩衝區.最後待資料報完整後,返回完整的資料報.注意這裡有個 資料報緩衝區,所以你需要copy 一次byte and 重新read 並且 new byte資料報.而且資料報緩衝區占用了一定的記憶體.這樣的套路優點在於簡單,穩定性好.缺點在於 效能無法發揮到極致.因為有gc,所以拖累了cpu,應為有緩衝區,所以拖累了記憶體.

當然也有做的好的,比如ikende的bx,採用資料鏈,繫結到socket上. 我稱他為a b c模式. 當recv到資料先寫入到資料鏈表(b)中,socket(a) 始終在寫你的下乙個或者下下個資料鏈表項,讓你(c)感覺你再讀一條資料長鏈. 這樣的好處在於,你可以減少一次copy. 但是缺點也很明顯你需要維護乙個很長的資料鏈表.cpu不敢說,但是記憶體是絕對需要很大的量來維持資料鏈表的. 而且你還需要乙個執行緒池來平衡a端和c端.當然如果用上ssl 協議.那麼這套邏輯的唯一get點在於可以方便的巢狀sslstream.不過bx是一款非常優秀的socket框架.除了記憶體高了點外,(這沒辦法設計模式).

效能方面:cpu 效能方面是非常高的.你不要看到它使用了await 就認為他效能不行了,為啥因為await生成了其他的**.其實那點**可以略微不計.總體效能可以保證不低於 或者 非常接近 c++ or golang 編寫的主流socket 框架. 記憶體方面: 除了基本執行記憶體 (一般來說.net core 程式大概是10m左右).連線數x你緩衝區的 記憶體大小了. 比如你每個鏈結4k.那麼設定1w鏈結就是39mb. 你也許會問.為什麼你要先建立.不會動態分配嗎?那樣更少,雖然延遲建立固然好,但是節省了記憶體,換來的是你在那剎那增加的cpu.和不穩定性. gc方面: 因為使用了pipe,所以緩衝區我們基本就沒有了,但是 如果你需要直接readbytes() 返回乙個byte 陣列的時候怎麼辦呢?這個真沒辦法,如果你需要返回乙個byte,那只能new.但是你如果需要讀取乙個memory or span 我採用了 memorypool 的方式在記憶體池裡給你分配一段大小適中的記憶體. 然後將資料copy到這塊記憶體中,供你使用. 這樣就可以避免gc了. 當然用完記得釋放它.而且你也可以將它轉換成byte使用,記住index len 簡單的方法:

using (var p8 = await fiberrw.readmemory())

使用了.net std 2發布. 沒辦法為了支援所有的.net支援的平台,捨棄了很多.net core的新功能.可是使用的平台包括 .net fx; .netcore; mono;. xamarim ios;xarmarim android. (注意如果是ios系統請使用[portable]版,因為ios aot禁用emit,所以只是protobuff.net 使用了乙個沒有emit的版本.

支援stream巢狀操作,比如sslstream gzipstream,詳細可以看demo.

我目前提供了乙個demo的多種版本供參考demo url

本框架對於乙個連線來說,在相同時間裡,只有乙個執行緒在處理它.不是在socket recv,就是在處理await read. 這樣設計有個好處在於,1 你不需要queue,2 對於當前連線來說,它的所有資源你都無需lock, 但是也有壞處 所以如果邏輯上對於這個執行緒堵塞了.那麼就會降低效能. 例如同步讀取資料庫.同步get乙個url.等. 那麼如何處理呢. 當你讀取到基本資料,處理完基本邏輯時. 需要處理複雜邏輯,你就需要 call async void method 什麼意思呢.下面來個**示範.

static async valuetask dataonbyline(ifiberrwfiberrw)

static async void readdata(int? cmd,int? p1,long? p2)

catch(exception er)

}

注意上面的 static async void readdata,以及try catch,因為如果這裡的異常 你根本無法外面捕捉,所以需要加乙個try catch捕捉異常,否則異常的話將導致伺服器崩潰.

第12期 江山代有才人出 5月刊

1 機房重構 實體類 model 的奇葩說 張婷 推薦理由 關於三層架構中的實體層 model 的理解,仁者見仁智者見智,那麼哪種說法才是比較正確,能更好地幫助我們理解呢?我們可以從這篇部落格中了解各種奇葩說和其中的學問。2 驗證碼功能實現 王洪玉 本篇部落格利用幾種簡易的方式實現了驗證碼的功能,不...

引進氛圍神器,石代5D魔幻舞台使餐廳煥發第二春

5年 10年的老店,怎麼能永葆青春,持續吸引顧客來店消費呢?裝修風格變化太快,今年工業風,明年原木風 剛裝兩年卻被告知過時,這種尷尬要怎麼破?年輕人都喜愛網紅店,可我的店沒有網紅的基因,又該如何吸引年輕人呢?以上的問題,相信是90 經營2年以上餐館的老闆們都有的困惑。今天我們給大家分享的這個案例,就...

引進氛圍神器,石代5D魔幻舞台使餐廳煥發第二春

5年 10年的老店,怎麼能永葆青春,持續吸引顧客來店消費呢?裝修風格變化太快,今年工業風,明年原木風 剛裝兩年卻被告知過時,這種尷尬要怎麼破?年輕人都喜愛網紅店,可我的店沒有網紅的基因,又該如何吸引年輕人呢?以上的問題,相信是90 經營2年以上餐館的老闆們都有的困惑。今天我們給大家分享的這個案例,就...