美文网首页Flume资料kafka专题
Kafka专题:1.kafka高性能的原因

Kafka专题:1.kafka高性能的原因

作者: 北交吴志炜 | 来源:发表于2019-02-03 18:25 被阅读0次

    高性能包含两个方向
    写的高性能
    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方法

    相关文章

      网友评论

        本文标题:Kafka专题:1.kafka高性能的原因

        本文链接:https://www.haomeiwen.com/subject/jfiysqtx.html