基于netty框架的socket长连接负载均衡解决方案
socket通讯的单机瓶颈
物联网的项目socket使用方式有两种:
- 短连接的socket请求
- 维持socket长连接的请求
对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据以后请求管道就关闭了,服务器与客户端的链接就释放了。但是对于socket长链接就不同了,当设备与服务器建立连接以后就要一直保持连接,或者说保持较长时间的链接,那么就会大量消耗服务器的资源。若存在大量的这样的请求以后服务器终究会受不了垮掉。通过对TcpClient/server最大连接数我们得知单机socket服务是存在最大链接数限制。尽管理论值很大,但还要考虑到实际服务器的内存/cpu/带宽等条件,我们不可能指望单机承载特别大的链接请求。
该如何负载均衡socket长连接的请求
提到负载均衡大家可能会想到很多负载均衡的框架,比如说比较出名的:nginx。但是悲催的是他是基于转发的方式,不能应用在socket长链接请求上。在这一块目前还没有特别优秀的处理框架,而且从技术角度来分析也不可能存在。那我们只能自己想办法了。
socket分发服务架构图

1、 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接。
a) 设备与服务器建立连接。
b) 服务器接收到连接请求后,立即将分配好的socket服务器ip与port信息响应给设备。
c) 服务器主动断开socket连接。
2、 设备得到ip与port以后,设备去连接socket服务器,然后与其进行协议通讯。
a) 设备连接到socket服务器。
b) socket服务器响应连接成功响应信息。
c) 设备与socket服务器保持长链接通讯。
*. 若设备未收到连接成功响应则再次尝试连接,若三次请求依旧没有成功建立连接,那么设备需要去请求分发服务器然后再重新上述操作。
*. 当设备在异常情况下链接不上socket服务器时,依旧尝试三次若不能成功,则直接请求分发服务器,然后再重复上述操作。
分发服务器处理业务
我们来看一下分发服务器该处理的业务:
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//todo 根据自己的负载情况获取相应的socket服务器信息
String ip = "192.168.1.188:2030";
SocketUtils.send(ctx,ip.getBytes());
ctx.close();
}
*. ip的获取需要根据自己的业务来完成。
总结
我们通过这样的方式就可以轻松的解决大量设备与服务器通讯的问题,若后面有更多的设备请求只需添加更多的socket服务器即可。当然可能大家担心分发服务器受不了,其实这是多余的,因为分发服务器只做转发,而且完成处理以后就直接把链接给释放,并且当设备拿到socket服务器的ip地址以后就将不在访问分发服务器了,它的压力是可控的不会特别也不会频繁。
转自:https://my.oschina.net/oswl/blog/967828?from=singlemessage&isappinstalled=0
基于netty框架的socket长连接负载均衡解决方案的更多相关文章
- 【转载】解决k8s中的长连接负载均衡问题
原文链接:一流铲屎官二流程序员[解决k8s中的长连接负载均衡问题] 长连接与短连接: 简介 长连接是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测 ...
- 基于netty框架的Socket传输
一.Netty框架介绍 什么是netty?先看下百度百科的解释: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- 基于心跳的socket长连接
http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...
- android端 socket长连接 架构
看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...
- 【Socket】关于socket长连接的心跳包
TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...
- 基于marathon-lb的服务自发现与负载均衡
参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...
- 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)
转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...
- HAProxy & Keepalived L4-L7 高可用负载均衡解决方案
目录 文章目录 目录 HAProxy 负载均衡器 应用特性 性能优势 会话保持 健康检查 配置文件 负载均衡策略 ACL 规则 Web 监控平台 Keepalived 虚拟路由器 核心组件 VRRP ...
随机推荐
- 《算法C语言实现》————三道题目
1.对于N = 10,100和1000,记录你的运行环境中分别运行一下程序所花费的时间.(用python) import datetime global a a = 0 def time_1(s): ...
- Python 面试题集锦【315+道题】
第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解释型和编译型编程语言? P ...
- node 开发web 登陆功能
node.js基于express框架搭建一个简单的注册登录Web功能 这个小应用使用到了node.js bootstrap express 以及数据库的操作 :使用mongoose对象模型来操作 ...
- linux服务器---配置bind
配置bind 1.确定已经安装bind软件,需要安装3 个bind.bind-chroot.bind-util [root@localhost wj]# yum install –y bind bin ...
- 轻型池不支持执行公共语言运行时(CLR)。禁用以下两个选项中的一个: “clr enabled”或“lightweight pooling”解决方法
执行2变一下代码 : 注意:1表示启用,0表示禁用. sp_configure ; GO sp_configure ; GO sp_configure ; go RECONFIGURE; GO E ...
- Linux Touch命令的8种使用技巧
Linux touch命令不仅可以用于在Linux上创建空文件. 您可以使用它来更改现有文件的时间戳,包括其访问权限和修改时间. 本文介绍了8种可以通过Linux终端使用touch命令的方案. 我们在 ...
- 20145304 Exp6 信息搜集与漏洞扫描
20145304 Exp6 信息搜集与漏洞扫描 实验后回答问题 (1)哪些组织负责DNS,IP的管理. NSI负责Internet顶级域名系统的注册.协调与维护,IAIA负责Internet的地址资源 ...
- 20145307陈俊达《网络对抗》Exp9 Web安全基础实践
20145307陈俊达<网络对抗>Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求 ...
- C++ 项目中直接使用JsonCpp源码文件
之前在网上看到使用JsonCpp都是以库的形式使用(编译源码为静态库或者动态库),这样引用很方便,但有时候报错调试看不到错误的地方,所以就想直接把源文件添加到项目中,方便调试 这是用到源码文件: 创建 ...
- 矩阵二分快速幂优化dp动态规划
矩阵快速幂代码: int n; // 所有矩阵都是 n * n 的矩阵 struct matrix { int a[100][100]; }; matrix matrix_mul(matrix A, ...