文档章节

Netty长连接集群方案

p
 peter_shen
发布于 2016/04/19 12:32
字数 430
阅读 893
收藏 6

使用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; 

    }

© 著作权归作者所有

共有 人打赏支持
p
粉丝 0
博文 1
码字总数 430
作品 0
海淀
程序员
t-io关于心跳、集群等技术问题咨询

1.看了下helloworld那个demo,client端有组特定心跳包的代码,但server端就一行关于心跳的代码, serverGroupContext.setHeartbeatTimeout(org.tio.examples.helloworld.common.Const.TIMEOU...

鸿鹄之志1984
03/21
0
0
Netty 入门与实战:仿写微信 IM 即时通讯系统

被小伙伴日常催更了一个多月的 Netty 小册终于和大伙正式见面了,为了答谢小伙伴对小册的厚爱,我将赠送15个免费阅读小册的兑换码。 有两种方式可以获取免费兑换码: 1. 在本篇文章后面留言:...

闪电侠的博客
09/26
0
0
CIM 2.1.0 发布,即时通讯方案

CIM 2.1.0 发布了,基于apache mina 的 java即时通讯服务端。与android 客户端完美结合,同时支持其他语言(ios,c,ActionScript,.net等)客户端的即时通信。 说明: 此开源版本为基础功能版本...

远方夕阳
2016/07/14
3K
6
许雪里/xxl-rpc

《分布式服务通讯框架XXL-RPC》 一、简介 1.1 概述 XXL-RPC是一个分布式服务通讯框架,提供稳定高性能的RPC远程服务调用功能。现已开放源代码,开箱即用。 1.2 特性 1、快速接入:接入步骤非...

许雪里
2015/11/13
0
0
自建配置中心现状及架构调整(一)

现状: 1、用户:公司内部已推广至超过20个系统,包括wms、快递线、国际线、结算等公司核心产品。 2、系统:至发布上线起,客户端版本已迭代10+次,服务端版本迭代2次; duang服务端界面,重...

打破突破
2017/09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
24分钟前
1
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
7
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
0
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
0
0
JAVA 内存回收

参考:https://www.cnblogs.com/leesf456/p/5218594.html 1,JMV 中哪些可以作为 GC Root? 1. 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。 2. 方法区中的类静态属性引...

Carlyle_Lee
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部