ibm mq客户端连接服务端_网络编程Netty IoT百万长连接优化,万字长文精讲

IoT是什么

The Internet of things的简称IoT,即是物联网的意思

IoT推送系统的设计

比如说,像一些智能设备,需要通过APP或者微信中的小程序等,给设备发送一条指令,让这个设备下载或者播放音乐,那么需要做什么才可以完成上面的任务呢?

1d8de596e7e7cd9eab4738dde3ac2d65.png

首先需要推送服务器,这个服务器主要负责消息的分发,不处理业务消息;设备会连接到推送服务器,APP通过把指令发送到推送服务器,然后推送服务器再把指令分发给相应的设备。

可是,当买设备的人越来越多,推送服务器所能承受的压力就越大,这个时候就需要对推送服务器做集群,一台不行,就搞十台,那么还有一个问题,就是推送服务器增加了,设备如何找到相应的服务器,然后和服务器建立连接呢,注册中心可以解决这个问题,每一台服务器都注册到注册中心上,设备会请求注册中心,得到推送服务器的地址,然后再和服务器建立连接。

而且还会有相应的redis集群,用来记录设备订阅的主题以及设备的信息;APP发送指令到设备,其实就是发送了一串数据,相应的会提供推送API,提供一些接口,通过接口把数据发送过去;而推送API不是直接去连接推送服务器的,中间还会有MQ集群,主要用来消息的存储,推送API推送消息到MQ,推送服务器从MQ中订阅消息,以上就是简单的IoT推送系统的设计。

下面看下结构图:

356329f0e36e7bbba823601a7972193f.png

注意:设备连接到注册中心的是短连接,设备和推送服务器建立的连接是长连接

心跳检测机制

简述心跳检测

心跳检测,就是判断对方是否还存活,一般采用定时的发送一些简单的包,如果在指定的时间段内没有收到对方的回应,则判断对方已经挂掉

Netty提供了IdleStateHandler类来实现心跳,简单的使用如下:

pipeline.addFirst(new IdleStateHandler(0, 0, 1, TimeUnit.SECONDS));

下面是IdleStateHandler的构造函数:

public IdleStateHandler(            long readerIdleTime, long writerIdleTime, long allIdleTime,            TimeUnit unit) {        this(false, readerIdleTime, writerIdleTime, allIdleTime, unit);}

四个参数说明:

  1. readerIdleTime,读超时时间
  2. writerIdleTime,写超时时间
  3. allIdleTime,所有事件超时时间
  4. TimeUnit unit,超时时间单位
d0ce609ae1f2c0c39e8ff624e5ca2953.png

心跳检测机制代码示例

简单示例: 服务端:

static final int BEGIN_PORT = 8088;    static final int N_PORT = 100;    public static void main(String[] args) {        new PingServer().start(BEGIN_PORT, N_PORT);    }    public void start(int beginPort, int nPort) {        System.out.println("启动服务....");        EventLoopGroup bossGroup = new NioEventLoopGroup(1);        EventLoopGroup workerGroup = new NioEventLoopGroup();        ServerBootstrap bootstrap = new ServerBootstrap();        bootstrap.handler(new LoggingHandler(LogLevel.INFO));        bootstrap.group(bossGroup, workerGroup);        bootstrap.channel(NioServerSocketChannel.class);        bootstrap.childOption(ChannelOption.SO_REUSEADDR, true);        bootstrap.childHandler(new ChannelInitializer() {            @Override            protected void initChannel(SocketChannel ch) throws Exception {                ChannelPipeline pipeline = ch.pipeline();                pipeline.addFirst(new IdleStateHandler(0, 0, 1, TimeUnit.SECONDS));                pipe
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值