怎么把netty的链接通道存储到redis中这样后续可以通过key取出channel给客户端发消息

鸣谦 发布于 2018/06/01 11:28
阅读 11K+
收藏 2

如何使用英特尔®oneAPI工具实现PyTorch 优化,直播火热报名中>>>

请问下,怎么把netty的链接通道存储到redis中这样后续可以通过key取出channel给客户端发消息

或者说有什么更好的方式去存取channel

加载中
1
kakai
kakai
channel不能序列化存储到redis,就算存进去了取出来也不能用,一般就是在本地将用户ID与socket信道做kv存储。看你的需求应该是想做socket集群吧,socket集群还是有点复杂的,一般要有主从服务器,主服务器进行数据转发。像redis集群实现原理是所有服务器具有服务端和客户端功能,任何两台服务都能彼此通信,更详细的架构方案你可以去看看redis集群实现原理。我一般做socket集群就是简单的一台主服务器,多台从服务器,主服务器转发数据并分析从服务器的负载。
0
繁华成落叶
繁华成落叶

把channel信息 放在redis的value ,对应的key可以为客户端的唯一编号如手机号码,mac地址等

0
鸣谦

引用来自“开源中国布政使”的评论

把channel信息 放在redis的value ,对应的key可以为客户端的唯一编号如手机号码,mac地址等

channel不能序列化,是把channel 的id存入redis中吗

0
繁华成落叶
繁华成落叶
ChannelHandlerContext 对象当成value
0
鸣谦

引用来自“节节草”的评论

channel不能序列化存储到redis,就算存进去了取出来也不能用,一般就是在本地将用户ID与socket信道做kv存储。看你的需求应该是想做socket集群吧,socket集群还是有点复杂的,一般要有主从服务器,主服务器进行数据转发。像redis集群实现原理是所有服务器具有服务端和客户端功能,任何两台服务都能彼此通信,更详细的架构方案你可以去看看redis集群实现原理。我一般做socket集群就是简单的一台主服务器,多台从服务器,主服务器转发数据并分析从服务器的负载。

嗯,我想单独把客户端和通道存到一台共有的数据库上,然后根据客户端mac进行发送信息,但是channel不能序列化,所以请问下是否有其他更好的方案。我等会去研究redis集群实现原理。

0
鸣谦

引用来自“开源中国布政使”的评论

ChannelHandlerContext 对象当成value

我试了,可能方法不对,对ChannelHandlerContext进行序列化之后还是存不进去。

0
呜呜啦啦乌拉拉
呜呜啦啦乌拉拉

netty的通道是和机器的硬件绑定的,无法序列化。通用做法都是做标记,将标记共享,然后各个服务器之间有通道,只要知道netty的那个通道是在那个机器上,先将数据发到那台服务器,然后在找到channel然后进行通信

繁华成落叶
繁华成落叶
那数据一般是通过什么方式 发到对应的服务器的
0
繁华成落叶
繁华成落叶

是不是ChannelHandlerContext 没有实现序列化接口,你自己实现个类extends它,然后再实现序列化接口。不知道这样可不可以。没有试过保存在redis。我也是保存在本地的。

kakai
kakai
ChannelHandlerContext上绑定的socket channel是与硬件网卡相关的,所以不能序列化,你建议再多的序列化方式都是不可行的,就算序列化成功,取出来也不能正确的与计算机网卡绑定,照样是不能用的。
0
moyiguke
moyiguke

挑选Netty服务器给客户端发送是可以做到的,不过不是通过序列化和反序列化的方式。

假设你当前系统是BackendServer,拥有多个消息服务NettyServer,那么简单的,可以使用Zookeeper做节点发现和管理。步骤如下 ①NettyServer启动的时候往ZK注册 ②BackendServer 启动ZK客户端,发现可用Netty服务。③ BackendServer需要发消息的时候,选择可用节点,作为Netty的client向NettyServer发送消息,NettyServer作为Proxy,将消息转发给实际的客户端。

不建议小团队自己实现分布式。确实有分布式需求:①实时的消息传递(即时性好),可以选择Akka:https://akka.io/。②允许少量延迟,选择Kafka,RocketMQ之类的中间件(吞吐量高),消息先发往中间件,然后NettyServer实现Consumer往客户端发送消息即可。③RPC……

 

鸣谦
嗯,谢谢你提供的思路
0
kakai
kakai

我的实现方案是用netty做一个中心服务器,其它下属服务器全部作为客户端连接到这个中心服务器上,再把外部应用登录服以http服务的方式独立出来,http服务现有且成熟的负载集群方案,登录再多也容易解决,用户请求登录服进行登录,登录服再请求netty中心服务器分析其下属各个socket从服务器的负载情况,选择一个相对较优的并将host、port返回给外部应用,外部应用拿到这个host、port后再连接相应的socket从服务器,因为外部应用的用户可能连接到不同的从服务器上,为了用户之间的正常通信就得利用从服务器将数据转发到中心服务器,再由中心服务器转发到用户对应的从服务器,然后从服务器将数据发送给外部应用的socket客户端。

鸣谦
回复 @节节草 : 好的,谢谢
kakai
kakai
建议楼主还可以看看LVS虚拟化socket的方式,仅支持linux系统,其也是socket集群及负载均衡的一种实现方式,我也没用过,只是简单的了解过,希望对楼主有用。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部