重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
目前websocket技術已經很成熟,選型Go語言,當然是為了節省成本以及它強大的高并發性能。我使用的是第三方開源的websocket庫即gorilla/websocket。
創新互聯主營東營網站建設的網絡公司,主營網站建設方案,成都app軟件開發,東營h5小程序開發搭建,東營網站營銷推廣歡迎東營等地區企業咨詢
由于我們線上推送的量不小,推送后端需要部署多節點保持高可用,所以需要自己做集群,具體架構方案如圖:
Auth Service:鑒權服務,根據Token驗證用戶權限。
Collect Service:消息采集服務,負責收集業務系統消息,存入MongoDB后,發送給消息分發服務。
Dispatch Service:消息分發服務,根據路由規則分發至對應消息推送服務節點上。
Push Service:消息推送服務,通過websocket將消息推送給用戶。
集群推送的關鍵點在于,web端與服務端建立長連接之后,具體跟哪個推送節點保持長連接的,如果我們能夠找到對應的連接節點,那么我們就可以將消息推送出去。下面講解一下集群的大致流程:
1. web端用戶登錄之后,帶上token與后端推送服務(Push Service)保持長連接。
2. 推送服務收到連接請求之后,攜帶token去鑒權服務(Auth Service)驗證此token權限,并返回用戶ID。
3. 把返回的用戶ID與長連接存入本地緩存,保持用戶ID與長連接綁定關系。
4. 再將用戶ID與本推送節點IP存入redis,建立用戶(即長連接)與節點綁定關系,并設置失效時間。
5. 采集服務(Collect Service)收集業務消息,首先存入mongodb,然后將消息透傳給分發服務(Dispatch Service)。
6. 分發服務收到消息之后,根據消息體中的用戶ID,從redis中獲取對應的推送服務節點IP,然后轉發給對應的推送節點。
7. 推送服務節點收到消息之后,根據用戶ID,從本地緩存中取出對應的長連接,將消息推送給客戶端。
其他注意事項:
2021-11-10
列表是一種非連續的存儲容器,有多個節點組成,節點通過一些變量記錄彼此之間的關系
單鏈表和雙鏈表就是列表的兩種方法。
原理:A、B、C三個人,B懂A的電話,C懂B的電話只是單方知道號碼,這樣就形成了一個單鏈表結構。
如果C把自己的號碼給B,B把自己的號碼給A,因為是雙方都知道對方的號碼,這樣就形成了一個雙鏈表結構
如果B換號碼了,他需要通知AC,把自己的號碼刪了,這個過程就是列表的刪除操作。
在Go語言中,列表使用 container/list 包來實現,內部的實現原理是雙鏈表,列表能夠高效地進行任意位置的元素插入和刪除操作。
列表初始化的兩種辦法
列表沒有給出具體的元素類型的限制,所以列表的元素可以是任意類型的,
例如給列表中放入了一個 interface{} 類型的值,取出值后,如果要將 interface{} 轉換為其他類型將會發生宕機。
雙鏈表支持從隊列前方或后方插入元素,分別對應的方法是 PushFront 和 PushBack。
列表插入函數的返回值會提供一個 *list.Element 結構,這個結構記錄著列表元素的值以及與其他節點之間的關系等信息,從列表中刪除元素時,需要用到這個結構進行快速刪除。
遍歷完也能看到最后的結果
學習地址:
PUSH指令主要用于編寫子程序和中斷服務程序,可以臨時保存程序狀態字PSW和累加器ACC的內容 或其它寄存器和存儲器單元的內容。
在子程序和中斷服務程序結束返回主程序前,要用POP彈棧指令,從堆棧中取出被保護的數據,恢復程序狀態字PSW和累加器ACC的內容 或其它寄存器和存儲器單元的內容。
呵呵 滿意 就選滿意回答啊
package main
import (
"container/list"
"fmt"
"strings"
)
func main() {
items := list.New()
for _, x := range strings.Split("ABCDEFGH", "") {
items.PushFront(x)
}
items.PushBack(9)
for element := items.Front(); element != nil; element = element.Next() {
switch value := element.Value.(type) {
case string:
fmt.Printf("%s ", value)
case int:
fmt.Printf("%d ", value)
}
}
fmt.Println()
}