1

初始化网络连接

假设我们消息要发送到192.168.1.10的broker中,假设ID为1,在建立连接的时候,会在缓存中,保存这个Node的连接状态,包括DISCONNECTED, CONNECTING, CONNECTED,由于我们是建立连接,所以刚开始内存中的状态就是CONNECTING

image.png

与broker创建连接,其实就是标准的NIO操作了,创建一个SocketChannel与192.168.1.10连接,并在这个SocketChannel上注册了一个OP_CONNECT。

image.png

注册完后,就需要把SelectionKey封装成一个KafkaChannel,通过node的id作为映射,保存在内存里。并且SelectionKey和KafkaChannel需要做绑定,这样就可以把监听到的事件交给KafkaChannel进行处理。

到这里,我们可以看到,ID为1的node对应着一个连接状态以及一个KafkaChannel。如果创建连接失败了,连接状态就会被改为DISCONNECTED

如果连接成功了,状态就会改为CONNECTED

image.png

绑定OP_WRITE

在发送数据的时候,需要绑定OP_WRITE事件。在绑定之前,需要判断是否可以发送这个请求。

1、连接是否已经建立

当我们内存中,有node对应的连接状态,且这个连接状态为CONNECTED,那就是已经建立好了连接。

image.png

2、Channel已经准备好了

内存中,有node对应的KafkaChannel,且这个KafkaChannel已经准备好了。

image.png

3、请求数量不超过5

这个是由max.in.flight.requests.per.connection设置的,默认为5,也就是说,在生产者客户端,最多只有5个请求,如果此时,已经有5个请求了,那当前的请求就不能进行发送。

如果以上三个条件都满足,就会把请求缓存起来,用来判断不能超过5个请求数。

每个broker都对应这个一个队列,请求数量不超过5,指的是每个broker对应的请求数量。

image.png

然后从缓存中拿到KafkaChannel,通过KafkaChannel注册已OP_WRITE事件。

image.png

发送请求

发送之前,这里要先看看连接状态,如果还没有连接,那就要完成网络连接才可以发送。完成连接后,开始监听OP_READ事件。

如果消息已经发送出去了,此时就需要把OP_WRITE移除掉。

由于可能如下图一样,可能有多个发送的OP_WRITE在SelectionKey中,那就需要进行迭代,把每个请求都发送出去。

image.png


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆