把channel信息 放在redis的value ,对应的key可以为客户端的唯一编号如手机号码,mac地址等
channel不能序列化,是把channel 的id存入redis中吗
嗯,我想单独把客户端和通道存到一台共有的数据库上,然后根据客户端mac进行发送信息,但是channel不能序列化,所以请问下是否有其他更好的方案。我等会去研究redis集群实现原理。
我试了,可能方法不对,对ChannelHandlerContext进行序列化之后还是存不进去。
netty的通道是和机器的硬件绑定的,无法序列化。通用做法都是做标记,将标记共享,然后各个服务器之间有通道,只要知道netty的那个通道是在那个机器上,先将数据发到那台服务器,然后在找到channel然后进行通信
是不是ChannelHandlerContext 没有实现序列化接口,你自己实现个类extends它,然后再实现序列化接口。不知道这样可不可以。没有试过保存在redis。我也是保存在本地的。
我的实现方案是用netty做一个中心服务器,其它下属服务器全部作为客户端连接到这个中心服务器上,再把外部应用登录服以http服务的方式独立出来,http服务现有且成熟的负载集群方案,登录再多也容易解决,用户请求登录服进行登录,登录服再请求netty中心服务器分析其下属各个socket从服务器的负载情况,选择一个相对较优的并将host、port返回给外部应用,外部应用拿到这个host、port后再连接相应的socket从服务器,因为外部应用的用户可能连接到不同的从服务器上,为了用户之间的正常通信就得利用从服务器将数据转发到中心服务器,再由中心服务器转发到用户对应的从服务器,然后从服务器将数据发送给外部应用的socket客户端。
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,然后进行消息发送
把channel信息 放在redis的value ,对应的key可以为客户端的唯一编号如手机号码,mac地址等
引用来自“开源中国布政使”的评论
把channel信息 放在redis的value ,对应的key可以为客户端的唯一编号如手机号码,mac地址等
channel不能序列化,是把channel 的id存入redis中吗
引用来自“节节草”的评论
channel不能序列化存储到redis,就算存进去了取出来也不能用,一般就是在本地将用户ID与socket信道做kv存储。看你的需求应该是想做socket集群吧,socket集群还是有点复杂的,一般要有主从服务器,主服务器进行数据转发。像redis集群实现原理是所有服务器具有服务端和客户端功能,任何两台服务都能彼此通信,更详细的架构方案你可以去看看redis集群实现原理。我一般做socket集群就是简单的一台主服务器,多台从服务器,主服务器转发数据并分析从服务器的负载。嗯,我想单独把客户端和通道存到一台共有的数据库上,然后根据客户端mac进行发送信息,但是channel不能序列化,所以请问下是否有其他更好的方案。我等会去研究redis集群实现原理。
引用来自“开源中国布政使”的评论
ChannelHandlerContext 对象当成value我试了,可能方法不对,对ChannelHandlerContext进行序列化之后还是存不进去。
netty的通道是和机器的硬件绑定的,无法序列化。通用做法都是做标记,将标记共享,然后各个服务器之间有通道,只要知道netty的那个通道是在那个机器上,先将数据发到那台服务器,然后在找到channel然后进行通信
是不是ChannelHandlerContext 没有实现序列化接口,你自己实现个类extends它,然后再实现序列化接口。不知道这样可不可以。没有试过保存在redis。我也是保存在本地的。
我的实现方案是用netty做一个中心服务器,其它下属服务器全部作为客户端连接到这个中心服务器上,再把外部应用登录服以http服务的方式独立出来,http服务现有且成熟的负载集群方案,登录再多也容易解决,用户请求登录服进行登录,登录服再请求netty中心服务器分析其下属各个socket从服务器的负载情况,选择一个相对较优的并将host、port返回给外部应用,外部应用拿到这个host、port后再连接相应的socket从服务器,因为外部应用的用户可能连接到不同的从服务器上,为了用户之间的正常通信就得利用从服务器将数据转发到中心服务器,再由中心服务器转发到用户对应的从服务器,然后从服务器将数据发送给外部应用的socket客户端。
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,然后进行消息发送