我目前正在為 TypeDB 實現(xiàn) Golang 客戶端,并且正在為他們基于會話的心跳約定而苦苦掙扎。通常,您為每個客戶端實現(xiàn)心跳,這樣相對容易,只需在后臺運行一個 gorountine 并每隔幾秒發(fā)送一次心跳。然而,TypeDB 選擇在每個會話基礎(chǔ)上實現(xiàn)心跳(他們稱之為脈沖)。這意味著,每次創(chuàng)建新會話時,我都必須開始使用單獨的 GoRoutine 監(jiān)視該會話。反之,如果客戶端關(guān)閉了一個session,我就得停止監(jiān)聽。特別難看的是,我還必須每隔一段時間檢查一次停滯的會話。切換到每個客戶端心跳存在 GH 問題,但沒有 ETA,因此我必須使會話心跳起作用以防止服務端會話終止。到目前為止,我的解決方案:創(chuàng)建一個新會話打開該會話并檢查錯誤如果沒有錯誤,將會話添加到以會話 ID 為鍵的哈希圖中這似乎暫時有效。代碼,僅供上下文參考:https://github.com/marvin-hansen/typedb-client-go/blob/main/src/client/v2/manager_session.go為了監(jiān)控每個會話,我正在考慮兩個問題:Chanel 關(guān)閉多個 gorountines 有點棘手,可能會導致競爭條件。我需要某種錯誤組來捕獲心跳故障,即在服務器關(guān)閉或網(wǎng)絡鏈接錯誤的情況下。考慮到所有這些,我相信一個context.WithCancel可能是安全和理智的解決方案。到目前為止我想出的是:將全局上下文作為參數(shù)傳遞給心跳函數(shù)為每個調(diào)用心跳的會話創(chuàng)建一個新的上下文 WithCancel在 GoRoutine 中運行心跳,直到調(diào)用取消(通過 stopMonitoring)或發(fā)生錯誤我不太清楚的是,如何跟蹤從每個跟蹤會話返回的所有取消函數(shù),以確保我關(guān)閉與要關(guān)閉的會話匹配的正確 GoRotuine?感謝您提供解決此問題的任何提示。
1 回答

達令說
TA貢獻1821條經(jīng)驗 獲得超6個贊
我的兩分錢:
您可能需要反復運行心跳。
time.Ticker
在選擇周圍使用 for 和 a存儲地圖會話 ID —> func() 以跟蹤所有可取消的上下文。也許你應該將 id 轉(zhuǎn)換為字符串
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報
0/150
提交
取消