Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
UsherFall opened this issue Apr 21, 2023 · 10 comments
Open

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

UsherFall opened this issue Apr 21, 2023 · 10 comments

Comments

@UsherFall
Copy link

关于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
Copy link
Owner

LockGit commented Apr 21, 2023

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

@UsherFall
Copy link
Author

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

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

@UsherFall
Copy link
Author

由于目标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
Copy link
Owner

LockGit commented Apr 22, 2023

由于目标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
Copy link
Author

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

@LockGit
Copy link
Owner

LockGit commented Apr 22, 2023

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

是这个意思

@UsherFall
Copy link
Author

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

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

@LockGit
Copy link
Owner

LockGit commented Apr 22, 2023

可以,作为补偿机制吧

@UsherFall
Copy link
Author

UsherFall commented Apr 22, 2023

可以,作为补偿机制吧

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

@LockGit
Copy link
Owner

LockGit commented Apr 24, 2023

可以提

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants