基于netty框架的socket长连接负载均衡解决方案

摘要:
然而,长套接字链接不同。当设备连接到服务器时,它需要保持连接,或者长时间保持连接,这将消耗大量服务器资源。从到TcpClient/server的最大连接数,我们知道到单个套接字服务的最大连接数量是有限制的。但遗憾的是,它基于转发,不能应用于套接字长链接请求。图1显示了套接字分发服务的体系结构。设备请求分销商。分发服务器返回有效的套接字服务器IP和端口,然后断开连接。b) 套接字服务器响应成功连接。

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长连接负载均衡解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】随身HiFi 安卓OTG功能在音频上的妙用mysql5.7密码过期ERROR 1862 (HY000): Your password has expired. To log in you must change下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【SpringBoot WEB 系列】SSE 服务器发送事件详解

【SpringBoot WEB系列】SSE 服务器发送事件详解 SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发中,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用 本文主要知识点如下: SSE 扫盲,应用场景分析 借助异步请求实现 sse 功能,加深概念理解 使用SseEmitter实现一...

系统架构之负载均衡【F5 ginxLVSDNS轮询】

在做系统架构规划的时候,负载均衡,HA(高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点,当活动节点出现故障的时候,由备用节点接管)都是经常需要考虑的方案。对应并发及单点故障,考虑负载均衡方案是必不可少的。如果并发不高只是应对单点故障,则通常使用HA方案。 负载均衡(Load Balance)是集群技术(C...

Nginx网络连接配置

本文记录Nginx中网络连接的设置配置项。 1)读取HTTP头部超时时间 语法:client_header_timeout time(默认单位:秒); 默认:client_header_timeout 60; 配置块: http、server、location 在与客户端建立连接之后,将开始获取HTTP头部,如果在配置的时间之内没有读取到客户端发来的字节,...

boost.asio简单入坑

网络连接有短连接和长连接。顾名思义,connect之后一直不断开的是长连接,像公司用的数据Route模块;三次握手建立连接后收发一次数据后就断开,断开是四次握手,再次收发数据就再来三次握手建立连接是短连接。每种模式都有优缺点。短连接优点是:如果客户端数量大的话,可以让每个客户轮流请求到数据。缺点:每次连接(三次握手)断开(四次握手)都耗费资源。长连接相对的...

RocketMQ(八)RocketMQ的Consumer负载均衡

一、问题描述 RocketMQ的Consumer是如何做的负载均衡?比如:5个Consumer进程同时消费一个Topic,这个Topic只有4个queue会出现啥情况?反之Consumer数量小于queue的数据是啥情况? 二、源码剖析 1、RebalancePushImpl public class RebalancePushImpl extends R...

Linux高性能server编程——定时器

版权声明:本文为博主原创文章。未经博主允许不得转载。 https://blog.csdn.net/walkerkalr/article/details/36869913...