socket通讯的单机瓶颈

物联网的项目socket使用方式有两种:

  1. 短连接的socket请求
  2. 维持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长连接负载均衡解决方案的更多相关文章

  1. 【转载】解决k8s中的长连接负载均衡问题

    原文链接:一流铲屎官二流程序员[解决k8s中的长连接负载均衡问题] 长连接与短连接: 简介 长连接是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测 ...

  2. 基于netty框架的Socket传输

    一.Netty框架介绍 什么是netty?先看下百度百科的解释:         Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  3. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  4. 基于心跳的socket长连接

    http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...

  5. android端 socket长连接 架构

    看过包建强的<App研发录>之后对其中的基础Activity类封装感到惊讶,一直想找一种方式去解决关于app中使用socket长连接问题,如何实现简易的封装来达到主活动中涉及socket相 ...

  6. 【Socket】关于socket长连接的心跳包

    TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...

  7. 基于marathon-lb的服务自发现与负载均衡

    参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...

  8. 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)

    转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...

  9. HAProxy & Keepalived L4-L7 高可用负载均衡解决方案

    目录 文章目录 目录 HAProxy 负载均衡器 应用特性 性能优势 会话保持 健康检查 配置文件 负载均衡策略 ACL 规则 Web 监控平台 Keepalived 虚拟路由器 核心组件 VRRP ...

随机推荐

  1. Fenwick

    hdu1394 这题说的是给了一个序列计算这个序列的逆序对总共要进行n次 每次都将目前的第一个放到序列的最后一个位置然后 计算一次逆序对 这样我们只需要先求一次逆序对 然后接着每次都用F=F+(n-T ...

  2. ActiveMQ 安装以及集群搭建

    安装环境: jdk1.7 apache-activemq-5.11.1-bin.tar.gz VM虚拟机redhat6.5-x64:192.168.1.200 Xshell4 部署方案: 主机IP 集 ...

  3. Python: 字典列表: itemgetter 函数: 根据某个或某几个字典字段来排序列表

    问题:根据某个或某几个字典字段来排序Python列表 answer: 通过使用operator 模块的itemgetter 函数,可以非常容易的排序这样的数据结构 eg: rows = [ {'fna ...

  4. Web API设计方法论--比较完整的web api 开发过程

    为Web设计.实现和维护API不仅仅是一项挑战:对很多公司来说,这是一项势在必行的任务.本系列将带领读者走过一段旅程,从为API确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在Web上维护 ...

  5. 教你如何构建异步服务器和客户端的 Kotlin 框架 Ktor

    Ktor 是一个使用 Kotlin 以最小的成本快速创建 Web 应用程序的框架. Ktor 是一个用于在连接系统(connected systems)中构建异步服务器和客户端的 Kotlin 框架. ...

  6. Ubuntu 16.04下为Android编译OpenCV 3.2.0 Manager

    http://johnhany.net/2016/07/build-opencv-manager-for-android-on-ubuntu/ 最近想在Android上尝试一下SIFT和SURF匹配算 ...

  7. Antlr4 入门

    一.ANTRL 是什么 ANTLR 是用JAVA写的语言识别工具,它用来声明语言的语法,简称为“元语言”(meta-language). ANTLR 语法识别一般分为二个阶段: 1.词法分析阶段 (l ...

  8. Charles手机端抓包--证书

    应用测试: Charles通过无线对手机进行抓包 测试系统: ubuntu 16.04 LTS 测试手机: IOS 10.3(14E277) Charles版本: Charles 4.1.4 手机证书 ...

  9. Class<T>

    首先,什么是类类型? 可见: https://www.cnblogs.com/yanze/p/9717658.html Class<T>即T的类类型 如何获取Class<T>? ...

  10. 20145327《网络对抗》——注入shellcode并执行和Return-to-libc攻击深入

    20145327<网络对抗>--注入shellcode并执行 准备一段Shellcode 老师的shellcode:\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68 ...