问题
粘包拆包Kafka如何解决 先读取前4字节,转换为一个int,即长度 根据长度申请内存buffer 最后读取指定大小的数据到申请好的buffer中 生产者如何处理响应消息 收到成功的响应,则回收内存 如果有异常则回调函数通知用户,用户自定义业务逻辑处理 消息发送完后内存如何处理 见前文内存池回收内存处理 消息发送超时条件 超时时间默认30s 如何处理长时间没有收到响应的消息 broker节点标记为disconnect,kafka自己封装失联响应结果, 如果可重试则重新把发送失败的批次放入发送批次,否之将异常传给回调函数并回收内存资源 Processor线程 在服务端启动的时候,创建并启动了Acceptor线程和Processor线程,每个Acceptor默认管理3个Processor线程对象。 Acceptor线程的主要工作:接收客户端连接请求,创建对应的SocketChannel并轮询交给Processor线程处理。
Kafka 网络通讯
这里截取取自外部 https://www.modb.pro/u/312924 的文章 网络通讯流程 1 Acceptor接收客户端发来的请求 2 轮询分发给Processor线程处理 3 Processor将请求封装成Request对象,放到RequestQueue队列 4 KafkaRequestHandlerPool分配工作线程,处理RequestQueue中的请求 5 KafkaRequestHandler线程处理完请求后,将响应Response返回给Processor线程 6 Processor线程将响应返回给客户端 对照主从Reactor多线程模型:这里的Acceptor就相当于MainReactor,通过Selector用来接收连接请求,然后创建对应的SocketChannel, 交给某个Processor处理。而Processor就相当于SubReactor,真正建立网络连接,并注册OP_READ事件来读取数据。 KafkaRequestHandlerPool就是线程池对象,而KafkaRequestHandler是真正处理I/O请求操作的工作线程。 Kafka默认1个Acceptor线程对应3个Processor(由num.network.threads参数决定)线程. 而1个KafkaRequestHandlerPool线程池中包含8个KafkaRequestHandler工作线程。(由num.io.thread参数决定) 在Kafka安装目录/config/server.properties配置文件中,就可以看到这两个参数的默认值 Acceptor流程 1 Acceptor线程是在服务端程序启动的时候创建和启动的 2 每个Acceptor线程默认管理了3个Processor线程对象 Acceptor线程通过selector接收客户端的连接事件 一旦有连接事件发生,就创建一个SocketChannel对象 通过轮询的方式,将创建的SocketChannel对象分配给自己管理的Processor线程 每个Processor线程有一个保存SocketChannel的阻塞队列newConnections,该队列的容量为固定的20 综上,Acceptor线程做的事比较简单:接收客户端连接请求,创建对应的SocketChannel并轮询交给Processor线程处理
总结



