kafka 原理

kafka是基于发布、订阅模式的消息队列,由scala写成,吞吐强悍,适用于大数据实时处理。

架构

kafka 原理_第1张图片
topic:
producer:生产者
consumer group:消费组,内含多个消费者。
consumer:消费者从broker拉取消息,以适当速度消费消息。
offset:偏移量,相当于消息在队列里的位置。

broker:kafka集群由多个实例组成,每个实例称为broker。一个broker可以被多个topic共用。
partition:一个topic分成多个partition,每个partition处理一部分消息,每个partition内有序,每个partition只能由一个consumer消费,一个consumer可以消费多个partition,partition数<=consumer数。通过分区可以方便扩展,提高并发。
Replication:一个partition分成leader和多个follower,他们都成为replication,分布在多个broker上,replication数不能超过broker数。

原理

写入方式

producer采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,被赋予了一个唯一的 offset 值。属于 顺序写磁盘 ,顺序写比随机写要起码提速3个数量级!

分区方式

1.指明partition
2.没指明,但又key,将key的hash值对分区数取余
3.没有key,第一次调用时随机生成一个整数,此后每次自增,用这个数对分区数取余(round-robin算法)

存储结构

kafka 原理_第2张图片
每个partition分为多个segment,每个segment有一个.INDEX存放索引(log文件中消息的偏移地址)和一个.LOG存放数据。index和log文件以自己第一条消息的偏移量命名。

数据可靠性

at least once
at most once
exactly once

生产者信息发送至Broker

  1. producer 从 ZK 找到目标 Partition 的 Leader 元数据。
  2. producer 发送消息给 Leader。
  3. Leader 接受消息持久化,然后根据acks配置选择如何同步Follower。
  4. Follower 按照前面说的同步数据后给Leader回复ack。
  5. Leader 跟 Follower 同步完毕后 Leader 给 producer 回复 ack。

    acks配置

    request.required.acks = 0

    producer不等待 broker 的ack,提供了一个最低的延迟,broker接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据,对应 At Most Once 模式。

    request.required.acks = 1

    默认值,producer 等待 broker 的 ack,partition 的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据;认为leader返回 信息就成功了。

    request.required.acks = -1 / all

    producer 等待 broker 的 ack,partition 的 leader 和 follower (ISR中的)全部落盘成功后才返回 ack。
    但如果在 leader 收到信息返回ok,follower 收到信息但是发送 ack 时 leader 故障,此时生产者会重新给follower 发送个信息。
    对应 At Least Once 模式。

    幂等性

    无论生产者发送多少个重复消息,Server端只会持久化一条数据,在生产者参数中 enable.idompotence= true。运用的是broker对requestno做缓存的原理。

你可能感兴趣的:(java)