为什么采用TCP连接
为什么采用TCP连接作为底层的通讯协议?
1.利用TCP协议本身的高级功能。比如多路复用请求和同时轮询多个连接的能力。
多路复用请求会在一个物理连接上创建多个虚拟连接,每个虚拟连接负责流转各自的数据流。
什么时候创建TCP连接
1.kafkaProducer实例创建时启动Sender线程,创建于bootstrap.servers中所有Broker的TCP连接。
2.kafkaProducer更新元数据后,还会与集群所有的broker创建TCP连接。
3.Producer发消息发现没有与对应的Broker创建连接,会创建连接
4.第二点中创建的连接,支持在长时间空闲后被关闭
CLOSE_WAIT状态是在被动方的,即:主动方发起close请求(FIN),被动方回复ACK后,被动方将进入CLOSE_WAIT状态; 之后,被动方才发起FIN请求,进行后续的关闭操作。 这里有个疑问:就是为啥被动关闭的后果是会产生大量的CLOSE_WAIT连接呢? 个人的理解是被动方接下来会发起FIN请求来接着完成四次挥手中的后两次挥手。 直到看了下面的评论才明白,客户端有可能会hold住这个连接,比如不是使用完这个Producer实例发送完消息就进行关闭,而是一直持有,那么就可能会出现上面这种现象!
你关闭了连接,只是表示你不发送请求了。并不代表没有请求接收。这是存在 TIME_WAIT 状态的意义。所以谁发起关闭,谁存在 TIME_WAIT 状态。
如何关闭TCP连接
1.客户端主动关闭
producer.cloes方法或者关闭producer进程
2.被动关闭
设置connections.max.idle.ms,默认为9分钟没有使用连接,broker就会主动关闭连接,关闭会产生大量的CLOSE_WAIT连接