RabbitTeam / RabbitCloud

A lightweight cross-platform RPC.
Apache License 2.0
333 stars 130 forks source link

已离线连接未从ITransportClientFactory的客户端缓存中移除 #20

Closed yyjdelete closed 7 years ago

yyjdelete commented 7 years ago

问题是如果服务端离线后恢复或连接失败, 而客户端之前访问过此服务端, 那么后续请求将持续的请求给这个已离线的连接(即使后续网络已恢复), 而不会重新

另外DotNettyTransportClientFactory这里重设Bootstrap.Handler()不知道有没有线程安全的问题

majian159 commented 7 years ago

我记得是有健康检查的,10秒钟检查一次,如果监控检查成功则会重新分配请求。是否等待了10秒以上的时间呢? 代码https://github.com/RabbitTeam/RabbitCloud/blob/master/src/Rabbit.Rpc/Runtime/Client/HealthChecks/Implementation/DefaultHealthCheckService.cs

yyjdelete commented 7 years ago

等了10s的. Health的状态是改变了, 请求会被重新路由到这个服务器上来. 但之前连接过, 已经断开了的Channel没有重连, 也没有被从缓存中移除, 后续的操作其实一直都是在发送给这个已经关闭了的Channel.

另外刚去看了下dev分支, 感觉完全不一样啊(没试有没有这个问题)

majian159 commented 7 years ago

我晚些时候测试看看。 dev分支是2.0版本会有大改可以不用管。

yyjdelete commented 7 years ago

那我就不发PR了, 我那个提交也不知道有没有改出别的什么问题:-)

majian159 commented 7 years ago

可以pr上来,我看看。

yyjdelete commented 7 years ago

实际上就是上面那个啊, 没有其他的了 https://github.com/yyjdelete/RabbitCloud/commit/590f44f5ed0017757bf722634164b16c1e4dd1ab

majian159 commented 7 years ago

我确实发现了问题,感谢你的反馈。 这个问题我看你增加了代码

yyjdelete commented 7 years ago

那个catch是改成同步建立连接, 来捕获连接失败的情况.(不含断开)

DefaultChannelHandler那里一个是增加了ChannelInactive连接断开事件的处理, 另外一个改动是改GetAttribute, 主要是怀疑每次连接都动态修改ActionChannelInitializer, 同时建立多个连接的时候可能存在线程安全的问题, 所以就改成用DotNetty的相应机制来存储

majian159 commented 7 years ago

好的,已经完成合并。另外这个项目v2准备进行,如果你有时间可以参与进来给点意见。