Go語言實(shí)現(xiàn)websocket推送程序
最近要在一個go實(shí)現(xiàn)的K線服務(wù)器上追加一個websocket推送功能。
初步設(shè)想是在各品種每分鐘的數(shù)據(jù)完成后立即向各訂閱單位推送對應(yīng)的K線數(shù)據(jù)。
一、場景抽象
1用戶連接上服務(wù)器
2用戶訂閱某品種的某周期
3用戶退訂某品種某周期
4用戶斷開服務(wù)器
訂閱:
推送:
二、程序框架
由于go語言不熟,幸好網(wǎng)上有人做了成熟的框架:GitHub - gorilla/websocket: A fast, well-tested and widely used WebSocket implementation for Go.這個解決了怎樣使用websocket的問題
三、主要業(yè)務(wù)邏輯
每個連接開兩個線程
一個線程進(jìn)行數(shù)據(jù)寫入writePump,一個線程進(jìn)行數(shù)據(jù)讀取readPump,每當(dāng)有客戶端連接上服務(wù)器后,立即開啟這兩個線程。
讀線程邏輯圖:
寫線程邏輯圖:
程序啟動時開一個總控線程func (h *Hub) Run()
此線程用來處理客戶端的連接,斷開,訂閱和向訂閱信息的客戶端作相應(yīng)信息的廣播。
邏輯圖如下:
處理注冊
處理注冊的邏輯非常簡單,只是將客戶端的指針放置于指針map中即可,代碼如下:
// 注冊,客戶端連接上來的處理邏輯 func (h *Hub) registerMsg(client *Client) { h.clients[client] = true }
處理注銷
注銷需要分兩步走,首先把客戶端指針集合中的對應(yīng)指針刪除,同時刪除對應(yīng)的發(fā)送通道。然后遍歷內(nèi)容訂閱集合,刪除對應(yīng)的客戶端指針的元素,最后,若發(fā)現(xiàn)某訂閱內(nèi)容上已經(jīng)沒有任何客戶端指針,將其訂閱內(nèi)容一并刪除。
程序邏輯如下:
訂閱處理
訂閱最主要的是訂閱關(guān)系,我們可以用合約.周期作為key,使用客戶端連接上來的指針集作為value,每當(dāng)有用戶訂閱某內(nèi)容時,將相應(yīng)內(nèi)容下面的指針集上加上對應(yīng)此用戶的指針即可,訂閱關(guān)系如下:
推送處理
推送處理分兩種類型,一種為用戶訂閱的數(shù)據(jù)推送給到他們,一種為心跳包推送給到30秒內(nèi)沒有數(shù)據(jù)推送或訂閱動作的用戶。
推送訂閱的內(nèi)容:當(dāng)用戶訂閱的類型數(shù)據(jù)到達(dá)時,系統(tǒng)檢查此訂閱上的用戶指針,將數(shù)據(jù)推送到對應(yīng)指針的通道中,由各通道自行推送給各自的客戶端。
推送心跳包:當(dāng)某個連接上來的客戶端30秒內(nèi)沒有訂閱請求或是推送數(shù)據(jù),系統(tǒng)將自動推送心跳包,以維持連接不被斷開。
到此這篇關(guān)于Go語言實(shí)現(xiàn)websocket推送程序的文章就介紹到這了,更多相關(guān)Go websocket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go語言實(shí)現(xiàn)百萬級WebSocket連接架構(gòu)設(shè)計(jì)及服務(wù)優(yōu)化
- 一文帶你使用golang手?jǐn)]一個websocket中間件
- 使用Golang創(chuàng)建單獨(dú)的WebSocket會話
- Golang?WebSocket創(chuàng)建單獨(dú)會話詳細(xì)實(shí)例
- Golang構(gòu)建WebSocket服務(wù)器和客戶端的示例詳解
- golang用melody搭建輕量的websocket服務(wù)的示例代碼
- 基于Go+WebSocket實(shí)現(xiàn)實(shí)時通信功能
- Golang實(shí)現(xiàn)WebSocket服務(wù)的項(xiàng)目實(shí)踐
- Go?實(shí)現(xiàn)?WebSockets之創(chuàng)建?WebSockets
- 深入理解Golang中WebSocket和WSS的支持
相關(guān)文章
Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫
這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫,Golang?程序在運(yùn)行時加載C動態(tài)庫的技術(shù),跳過了Golang項(xiàng)目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項(xiàng)目開發(fā)部署的靈活性2022-07-07golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類型操作
這篇文章主要介紹了golang 實(shí)現(xiàn)interface{}轉(zhuǎn)其他類型操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀
這篇文章主要為大家介紹了Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法
最近將 golang 項(xiàng)目打包部署在不同環(huán)境,下面分享一下我的心得體會,對golang 項(xiàng)目打包部署環(huán)境變量設(shè)置方法感興趣的朋友一起看看吧2024-07-07