为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 context.WithCancel 启动和停止每个会话的心跳?

如何使用 context.WithCancel 启动和停止每个会话的心跳?

Go
暮色呼如 2022-11-28 14:37:28
我目前正在为 TypeDB 实现 Golang 客户端,并且正在为他们基于会话的心跳约定而苦苦挣扎。通常,您为每个客户端实现心跳,这样相对容易,只需在后台运行一个 gorountine 并每隔几秒发送一次心跳。然而,TypeDB 选择在每个会话基础上实现心跳(他们称之为脉冲)。这意味着,每次创建新会话时,我都必须开始使用单独的 GoRoutine 监视该会话。反之,如果客户端关闭了一个session,我就得停止监听。特别难看的是,我还必须每隔一段时间检查一次停滞的会话。切换到每个客户端心跳存在 GH 问题,但没有 ETA,因此我必须使会话心跳起作用以防止服务端会话终止。到目前为止,我的解决方案:创建一个新会话打开该会话并检查错误如果没有错误,将会话添加到以会话 ID 为键的哈希图中这似乎暂时有效。代码,仅供上下文参考:https://github.com/marvin-hansen/typedb-client-go/blob/main/src/client/v2/manager_session.go为了监控每个会话,我正在考虑两个问题:Chanel 关闭多个 gorountines 有点棘手,可能会导致竞争条件。我需要某种错误组来捕获心跳故障,即在服务器关闭或网络链接错误的情况下。考虑到所有这些,我相信一个context.WithCancel可能是安全和理智的解决方案。到目前为止我想出的是:将全局上下文作为参数传递给心跳函数为每个调用心跳的会话创建一个新的上下文 WithCancel在 GoRoutine 中运行心跳,直到调用取消(通过 stopMonitoring)或发生错误我不太清楚的是,如何跟踪从每个跟踪会话返回的所有取消函数,以确保我关闭与要关闭的会话匹配的正确 GoRotuine?感谢您提供解决此问题的任何提示。
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

我的两分钱:

  1. 您可能需要反复运行心跳。time.Ticker在选择周围使用 for 和 a

  2. 存储地图会话 ID —> func() 以跟踪所有可取消的上下文。也许你应该将 id 转换为字符串



查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号