Netty长连接集群方案
Netty长连接集群方案
peter_shen 发表于2年前
Netty长连接集群方案
  • 发表于 2年前
  • 阅读 492
  • 收藏 5
  • 点赞 1
  • 评论 0

使用Netty自定义协议连接APP和物联网设备,业务增大之后,势必需要使用集群方案,Netty的Channel并没有实现序列化接口,所以不能将Channel存储在redis或者Memecached中。我想了一个根据自定义session,利用redis实现的集群方案,记录一下。

1. 对于长连接的处理

自定义session,session中持有ChannelId(Netty 4.1)并产生sessionId,将session保存在redis中,并在redis中维护ChannelId和sessionId的关系,登录之后的操作都带有sessionId,根据sessionId可以查询到ChannelId,然后根据ChannelId可以通过ChannelGroup.find(ChannelId)获取到Channel对象。

2. 对于消息的处理

APP和IOT设备通过长连接,通过保持连接的那台服务器,将消息pub到redis集群中,而所有集群中的服务器都sub这个redis集群,一旦有消息,所有的服务器都会处理这些消息,通过消息中的sessionId从redis集群中获取到ChannelId, 因为Netty 4.1的channel是全局唯一的,然后根据ChannelId去查询本机是否存在对应这个Channel,如果存在的话,则说明该服务器持有对应的Channel,然后通过该Channel将消息发送给指定的APP或者IOT设备。

下一步要考虑如何通过Nginx做负载均衡,将长连接均匀的分布到Netty集群中

Nginx 1.9 已经支持TCP代理和负载均衡,并可以通过一致性哈希算法将连接均匀的分配到所有的服务器上

    upstream cloudsocket {

        hash $remote_addr consistent;

        server 10.0.0.88:9998 weight=5 max_fails=3 fail_timeout=30s;

        server 10.0.0.88:9999 weight=5 max_fails=3 fail_timeout=30s; 

    }

标签: netty redis iot cluster
共有 人打赏支持
粉丝 0
博文 1
码字总数 430
×
peter_shen
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: