高性能包含两个方向
写的高性能
1)顺序写+page cache
2)生产者批量发送消息集,压缩:生产者并不直接将消息发送给服务端,先在客户端把消息放入队列中,然后由一个消息发送线程从队列中拉取消息,以批量的方式发送给服务端。同一个节点上面的不同分区消息会一个批次发送,减少网络发送次数。kafka使用selector处理网络连接与读写处理。
读的高性能
1)顺序读+Zero copy
2)消费者批量拉取(可以指定大小)
开发者提升性能的手段
1)增加partition+增加消费者实例
什么时候为提交成功呢?
所有的ISR节点都写入成功,才算提交成功(注意,isr节点不是所有副本节点,是所有节点的一个子集,在PartitionInfo类中,包含两个属性 Node[] replicas 分区所有副本;另一个是Node[] inSyncReplicas 也就是ISR节点列表,当一个副本落后主副本太多,就会从isr列表中移除,避免影响消息的commit)
有序性如何保证?
同一分区内消息有序,不同的分区,消息无序。(对需要保证消费顺序的消息放到同一分区即可)
消息是如何负载均衡到某一个分区的呢?
1)round robin 随机轮询(消息没有key)
2)对key进行散列化,对分区数量取模得到分区编号
3)消息在生产者客户端就已经确定好了partition的id,每一个partition有一个双端队列来缓存客户端的消息,队列满了才进行一次向服务器的发送。发送的时候,是以节点为单位的,比如一个节点上有10个分区,这10个分区的消息,是一次网络请求进行发送的。
客户端网络连接对象NetworkClient管理了客户端与服务端之间的网络通信,包括连接的建立,发送客户端请求,读取客户端响应。
包含三个方法
1)ready (),服务端是否准备好,如果准备好,调用Selector.connect()方法建立连接
2)send(),将客户端请求加入inFlightRequests列表,然后调用Selector.send()方法,这一步只是将请求暂存到节点对应的网络通道中,还没有真正的发送出去。
针对同一个服务端,如果上一个客户端请求还没有发送完成,则不允许发送新的客户端请求。InFlightRequests类包含一个节 点到双端队列的映射结构。 在准备发送客户端请求时,请求将添加到指定节点对应的队列中;在收到 响应后 ,才会将请求从队列中移 除 。
3)poll(),真正的发送,调用Selector.poll方法
网友评论