LockGit / gochat

goim server write by golang !🚀
http://45.77.108.245:8080
MIT License
2.76k stars 470 forks source link

关于task层中的todo的想法 #54

Open UsherFall opened 1 year ago

UsherFall commented 1 year ago

关于task中push.go里的todo

//@todo when arg.ServerId server is down, user could be reconnect other serverId but msg in queue no consume
task.pushSingleToConnect(arg.ServerId, arg.UserId, arg.Msg)

因为在task里已经维护了关于connect层的serverId信息,那是不是只要做一个if判断就可以实现,也就是说如果当前serverId在task层里查找不到(服务失效)的话,就遍历task维护的connect层信息找到另一个有效的connect服务

LockGit commented 1 year ago

由于目标serverId故障,当前用户触发重连,可能连接到了其他的serverId上,这个时候msg要去往的serverId是要改变的。 应该弄一个获取当前userId此刻在那个serverId上的方法即可,这样投递出去的消息是可达的

UsherFall commented 1 year ago

由于目标serverId故障,当前用户触发重连,可能连接到了其他的serverId上,这个时候msg要去往的serverId是要改变的。 应该弄一个获取当前userId此刻在那个serverId上的方法即可,这样投递出去的消息是可达的

那比我想象的复杂好多,,这等于需要让connect的服务保持可用性?我看起来userId和serverId还是对应的关系

UsherFall commented 1 year ago

由于目标serverId故障,当前用户触发重连,可能连接到了其他的serverId上,这个时候msg要去往的serverId是要改变的。 应该弄一个获取当前userId此刻在那个serverId上的方法即可,这样投递出去的消息是可达的

再看了下发现昨天想错了!好像也没那么难,如果当前userId因为connect服务失效断开连接,然后再自主地去另一个connect服务身份认证的话,会把userId和serverId组成键值放到redis里。那这样的话在下面这个错误处理里再根据userId拿到serverId就可以了

    connectRpc, err := RClient.GetRpcClientByServerId(serverId)
    if err != nil {
        logrus.Infof("get rpc client err %v", err)
    }

但又有点太简单,是差了啥东西吗

LockGit commented 1 year ago

由于目标serverId故障,当前用户触发重连,可能连接到了其他的serverId上,这个时候msg要去往的serverId是要改变的。 应该弄一个获取当前userId此刻在那个serverId上的方法即可,这样投递出去的消息是可达的

再看了下发现昨天想错了!好像也没那么难,如果当前userId因为connect服务失效断开连接,然后再自主地去另一个connect服务身份认证的话,会把userId和serverId组成键值放到redis里。那这样的话在下面这个错误处理里再根据userId拿到serverId就可以了

  connectRpc, err := RClient.GetRpcClientByServerId(serverId)
  if err != nil {
      logrus.Infof("get rpc client err %v", err)
  }

但又有点太简单,是差了啥东西吗

不使用默认的arg.ServerId ===> 根据userId和serverId的映射关系取最新的应该是哪个serverId

UsherFall commented 1 year ago

看不太懂,我理解是redis用string类型存userId和serverId的对应关系,那只要用userId去查询拿到的应该就是userId对应的最新的serverId

LockGit commented 1 year ago

看不太懂,我理解是redis用string类型存userId和serverId的对应关系,那只要用userId去查询拿到的应该就是userId对应的最新的serverId

是这个意思

UsherFall commented 1 year ago

看不太懂,我理解是redis用string类型存userId和serverId的对应关系,那只要用userId去查询拿到的应该就是userId对应的最新的serverId

是这个意思 那按我上面说的那样改就可以吗?发起rpc请求错误后从redis里拿个severId再请求一次

LockGit commented 1 year ago

可以,作为补偿机制吧

UsherFall commented 1 year ago

可以,作为补偿机制吧

@LockGit 这个需要提个pr吗,要的话我测试下

LockGit commented 1 year ago

可以提