+
 新版

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

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

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

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

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

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

kakai
kakai
建议楼主还可以看看LVS虚拟化socket的方式,仅支持linux系统,其也是socket集群及负载均衡的一种实现方式,我也没用过,只是简单的了解过,希望对楼主有用。
0
呜呜啦啦乌拉拉
呜呜啦啦乌拉拉

client A B C D E F 连接到服务器S1,client G H I K L 连接到服务器S2,这两个都用MAP保存起来

redis保存信息:

{
    "S1": ["A", "B", "C", "D", "E", "F"],
    "S2": ["G", "H", "I", "K", "L"]
}

推送服务连接到 S1,S2

给B发送信息,先找到B所在的服务器,然后给S1发消息,让S1再在本地MAP中找到具体B的channel,然后进行消息发送

鸣谦
嗯,明白你的意思了
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部