缅怀袁老

in Daily Life

今天听闻噩耗,袁隆平院士我们称之为袁老去世了享年 91 岁,随之朋友圈也炸锅了,大家都在缅怀,悼念。

不得不说袁老对人类的贡献是伟大的,他是一个高尚的人,纯粹的人,脱离了低级趣味的人。找到了能够为之奋斗一生的事业,并在历史的篇章中留下了属于自己的篇章。

我虽然还在自己家的一亩三分地上挣扎,但是偶尔还是会仰望星空,怎么说呢保持激情,不要锤头丧气就是很好的生活状态。

Comment and share

Netty减少内存使用技巧:

  1. 能使用基本类型就不使用包装类型

  2. 减少对象本身大小 -> 应该定义成类变量的不要定义为实例变量

  3. Zero-copy

  4. Netty内存池使用

    • 内存池/非内存池的默认选择及切换方式

      io.netty.channel.defaultChannelConfig#allocator

    • 内存池实现 io.netty.buffer.pooledDirectByteBuf

    • 对外内存/堆内内存的默认选择及切换方式

    • 对外内存的分配本质

Comment and share

粘包原因

  • 发送方每次写入数据 < 套接字缓冲区大小
  • 接受方读取套接字缓冲区数据不够及时

半包原因

  • 发送方每次写入数据 > 套接字缓冲区大小
  • 发送方的数据大于协议的MTU(Maximum Transmission Unit 最大传输单元)必须拆包

根本原因

TCP是流式协议,消息无边际

udp像邮寄包裹,虽然是一次运输多个,但是每个包裹都有“界限”,一个一个签收,所以无粘包,拆包问题。

解决方式

  1. 改成短链接:一次链接发送一个数据包
  2. 封装成数据帧(fram)
    1. 固定长度—空间浪费
    2. 分割符—内容里出现分隔符时需要转义
    3. 固定长度字段存储内容长度信息—长度理论上有限制,需提前预知可能的最大长度,从而定义长度占用字节数 推荐
    4. 其它 如json里的{}

netty解码方式

假设我们把解决粘包/半包的问题的常用三种解码器叫一次解码

  • 固定长度 FixedLengthFrameDecoder
  • 分割符 DelimiterBasedFrameDecoder
  • 固定长度字段存内容长度信心 LengthFieldBasedFrameDecoder LengthFieldPrepender

二次解码:将字节转换成为实际使用的对象

Comment and share

IO定义

BIO:Thread-Per-Connection

NIO:Reactor

AIO: Proactor

I/O多路复用(技术术语:Reactor):

  1. 当多条连接共用一个阻塞对象后,进程只需要在一个阻塞对象上等待,而无需再轮训所有连接,常见的实现方式有select,epoll,kqueue等。
  2. 当某条连接有新的数据可以处理时,操作系统会通知进程,进程从阻塞状态返回,开始进行业务处理。

Reactor是一种开发模式,Reactor中文翻译为:反应堆。不是物理上的核反应堆,这儿代表的是:“事件反应”,可以理解为:“来一个事件我(Reactor)就有相应的反应”。Reactor也可以叫Dispatcher模式:

  • Reactor的数量可以变化:可以是一个Reactor,也可以是多个Reactor

  • 资源池的数量可以变化:可以是单线程,也可以是多线程

模式核心流程:

注册感兴趣的事件 -> 扫描是否有兴趣的事件发生 -> 事件发生后做出相应的处理

Reactor三种模式:

  • 单线程(单Reactor单线程)
  • 多线程(单Reactor多线程)
  • 主从多线程(多Reactor多线程)
Reactor单线程模式 EventLoopGroup eventGroup = new NioEventLoopGroup(1)
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);
非主从Reactor多线程模式 EventLoopGroup eventGroup = new NioEventLoopGroup()
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);
主从Reactor多线程模式 EventLoopGroup bossGroup = new NioEventLoopGroup()
EventLoopGroup workerGroup = new NioEventLoopGroup()
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup);

Comment and share

  • page 1 of 1
Author's picture

Topsion

Fullstack Developer


Coder


Xi'an China