前言
之前使用Netty消费Kafka中的数据,做实时数据上传的时候,数据总是积压,带宽总是在32Gbit/s,我在代码中对缓冲区做了一个容量监控,在发送的过程中一直提示容量不足不可写(后来拉扯了一年,证明是对端网络以及带宽问题,最后调整了网络和办卡,带宽达到了64Gbit/s)。后来为了收集问题证据,我还是学到了不少东西,包括今天要说的:缓冲区。
缓冲区
缓冲区,顾名思义就是用来做缓冲的,例如I/O中的BufferedInputStream,以及NIO里的Buffer。在我的应用中,数据传输底层使用的是socket(TCP),数据传输通常是由发送方和接收方组成,每一方都会有sendBuf和recvBuf。
sendBuf发送缓冲区,当应用程序需要发送数据时,数据首先被写入发送缓冲区。网络协议栈会从发送缓冲区中取出数据,进行协议处理(如TCP/IP封装),然后发送到网络上。
recvBuf是接收缓冲区,当数据从网络到达时,网络协议栈会将接收到的数据放入接收缓冲区。应用程序可以从接收缓冲区中读取数据进行处理。
如果应用程序处理数据的速度慢于网络接收速度,数据会暂时存储在接收缓冲区中,避免数据丢失。如果网络拥堵或接收端处理速度慢,数据会在发送缓冲区中等待,直到可以发送为止。
在数据传输中,我是客户端,对方是服务端。通过socket端口连接对面的服务进行发送,在数据发送过程中,其实是先将数据发送到客户端主机的sendBuf,然后再经过网络传输到对端主机的recvBuf,然后对面程序从recvBuf中读取数据。
Netty缓冲区
在Netty概念中,Buffer是数据载体的缓冲区,而在创建Netty客户端/服务端的时候,设置缓冲区就是数据在网络传输中的sendBuf和recvBuf。
bootstrap.childOption(ChannelOption.SO_SNDBUF, 32 * 1024); // 32KB
bootstrap.childOption(ChannelOption.