Netty集群如何共享Channel

www6223166 发布于 08/10 14:52
阅读 379
收藏 1

请大佬帮忙解决一个技术问题。项目使用netty作为服务端接入Gps硬件设备,GPS通过TCP协议与服务端发送数据,发送一共两种包体:发送登陆包告知服务端设备id。以后就一直发送定位包,不再携带设备id(tcp请求是长连接)。这种情况在单实例服务下,我使用netty生成的channelID与设备ID对应放入缓存,这种发送定位包的时候就能查询到设备ID,但是集群情况下我担心会有问题,因为硬件负载有可能将同一个tcp链接发到另外一个实例上,缓存内的对应关系就找不到,由于channelID是netty生成的,换一个实例以后ID肯定会变,如何解决,坐等大佬分析,急,在线等!

加载中
0
w
www6223166

已经解决,硬件可以根据来源ip+来源端口号确认唯一请求链接进行转发,将同一个请求映射到相同实例上.Nginx也有相应的TCP转发模块,经过测试能满足要求; 只要各个环境配置好,就不会出现同一TCP请求负载到其他实例上

0
JavaGG
JavaGG

硬件负载设备应该可以改包,增加包内容,我以得之前用过7层交换机是可以的

当你接你要new socket时,生成一个id,之后把这个id加在包里,发到后端的设备上

 

JavaGG
JavaGG
回复 @www6223166 : 没有的,你这样的设计就等于http,如果http没有cookie也不可能实现session,,如果你的负载均衡是软件来的,那大可以自己写,把这个id加进去就好
w
www6223166
有软件方面的处理办法吗?硬件我不懂啊
0
再好的网名也输给备注
再好的网名也输给备注

既然是长连接,为什么同一个连接会被转发到其他实例上呢?

再好的网名也输给备注
再好的网名也输给备注
回复 @www6223166 :一个请求本来就转发到一台设备上,楼主不要想多了
w
www6223166
服务为了高可用,就得起多个实例,上层会有负载均衡硬件,就会有这样得问题
0
kakai
kakai

软件层面不用想了,channel是与网卡绑定的,就算共享了也毫无意义。

kakai
kakai
回复 @www6223166 : 看看一致性hash是否能满足你的需求,一致性hash算法一般就是用于负载均衡,我个人基于netty的世界服集群就是用的一致性hash做的负载均衡。
w
www6223166
那我如何能调整负载均衡策略,使同一个TCP请求永远转发到同一个实例上?
0
汀雨小吉
汀雨小吉

博主解决了吗

 

汀雨小吉
汀雨小吉
回复 @www6223166 : channelID和设备ID放入内存需要修改吗?是对设备id进行一个hash吗
w
www6223166
已经解决,硬件可以根据来源ip+来源端口号确认唯一请求链接进行转发,将同一个请求映射到相同实例上.Nginx也有相应的TCP转发模块,经过测试能满足要求; 只要各个环境配置好,就不会出现同一TCP请求负载到其他实例上
返回顶部
顶部