初始化网络连接
假设我们消息要发送到192.168.1.10的broker中,假设ID为1,在建立连接的时候,会在缓存中,保存这个Node的连接状态,包括DISCONNECTED
, CONNECTING
, CONNECTED
,由于我们是建立连接,所以刚开始内存中的状态就是CONNECTING
。
与broker创建连接,其实就是标准的NIO操作了,创建一个SocketChannel与192.168.1.10连接,并在这个SocketChannel上注册了一个OP_CONNECT。
注册完后,就需要把SelectionKey封装成一个KafkaChannel,通过node的id作为映射,保存在内存里。并且SelectionKey和KafkaChannel需要做绑定,这样就可以把监听到的事件交给KafkaChannel进行处理。
到这里,我们可以看到,ID为1的node对应着一个连接状态以及一个KafkaChannel。如果创建连接失败了,连接状态就会被改为DISCONNECTED
。
如果连接成功了,状态就会改为CONNECTED
。
绑定OP_WRITE
在发送数据的时候,需要绑定OP_WRITE
事件。在绑定之前,需要判断是否可以发送这个请求。
1、连接是否已经建立
当我们内存中,有node对应的连接状态,且这个连接状态为CONNECTED
,那就是已经建立好了连接。
2、Channel已经准备好了
内存中,有node对应的KafkaChannel,且这个KafkaChannel已经准备好了。
3、请求数量不超过5
这个是由max.in.flight.requests.per.connection
设置的,默认为5,也就是说,在生产者客户端,最多只有5个请求,如果此时,已经有5个请求了,那当前的请求就不能进行发送。
如果以上三个条件都满足,就会把请求缓存起来,用来判断不能超过5个请求数。
每个broker都对应这个一个队列,请求数量不超过5,指的是每个broker对应的请求数量。
然后从缓存中拿到KafkaChannel,通过KafkaChannel注册已OP_WRITE
事件。
发送请求
发送之前,这里要先看看连接状态,如果还没有连接,那就要完成网络连接才可以发送。完成连接后,开始监听OP_READ
事件。
如果消息已经发送出去了,此时就需要把OP_WRITE
移除掉。
由于可能如下图一样,可能有多个发送的OP_WRITE
在SelectionKey中,那就需要进行迭代,把每个请求都发送出去。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。