-
Topic相当于传统消息系统MQ中的一个队列Queue,Producer端发送的message必须指定是发送到哪个Topic,但是不需要指定Topic下的哪个Partition,因为Kafka会把收到的message进行load balance,均匀的分布在这个topic下的不同的partition上( hash(message) % [broker数量]?)。物理上存储上,这个Topic会分成一个或多个Partition,每个Partiton相当于是一个子Queue。在物理结构上,每个Partition对应一个物理的目录(文件夹),文件夹命名是[topicname][partition][序号],一个Topic可以有无数多的Partition,根据业务需求和数据量来设置
-
一个Topic的Partition数量大于等于Broker的数量,?可以提高吞吐率
-
同一个Partition的Replica尽量分散到不同的机器,?高可用
-
当add a new partition的时候,Partition里面的message不会重新进行分配,原来的Partition里面的message数据不会变,新加的这个Partition刚开始是空的,随后进入这个Topic的message就会重新参与所有Partition的load balance,消息被顺序追加到每个分区日志文件的尾部。Kafka 中的分区可以分布在不同的服务器(broker)上,也就是说,一个主题可以横跨多个broker,以此来提供比单个 broker 更强大的性能
-
Partition Replication:一个Topic中的每个Partition可以在其他Broker上存储副本,以便某Broker节点宕机不会影响整个Kafka集群,Replication数量不能大于Cluster中Broker节点的数量,否则报错(这里的Replication数量是Partition的总数,包括一个leader Partition和其他Copy副本的follower Partition)
-
副本数越高,系统虽然越稳定,但是回来带资源和性能上的下降,副本少的话,也会造成系统丢数据的风险
-
传送消息机制:Producer先将message传送给leader Partition,leader Partition再将message复制给follower Partition
-
在向Producer发送ACK前需要保证有多少个Replication已经收到该消息:根据ack配的个数而定
- Partition Replication中的leader和follower是由Zookeeper进行控制
- Partition ACK:当ack=0时,表示producer发送数据之后,则就表示成功
- 当ack=1,表示producer写partition leader成功后,broker就返回成功,无论其他的partition follower是否写成功
- 当ack=2,表示producer写partition leader和其他一个follower成功的时候, broker就返回成功,无论其他的partition follower是否写成功
- 当ack=-1 [parition的数量]的时候,表示只有producer全部写成功的时候,才算成功,kafka broker才返回成功信息。这里需要注意的是,如果ack=1的时候,一旦有个broker宕机导致partition的follower和leader切换,会导致丢数据
-
Message:
- Message状态:在Kafka中,消息的状态被保存在consumer中,broker不会关心哪个消息被消费了被谁消费了,只记录一个offset值(指向partition中下一个要被消费的消息位置),这就意味着如果consumer处理不好的话,broker上的一个消息可能会被消费多次
- Kafka中会把消息持久化到本地文件系统中,并且保持o(1)极高的效率。message的写入持久化是顺序写入的,因此message在被消费的时候也是按顺序被消费的,保证partition的message是顺序消费的
- Producer:Producer向Topic发送message,可以不需要指定partition,直接发送就好了。kafka通过partition ack来控制是否发送成功并把信息返回给producer
- (1)At most once消息可能会丢,绝对不会重复传输
- (2)At least once 消息绝对不会丢,但是可能会重复传输
- (3)Exactly once每条信息肯定会被传输一次且仅传输一次,这是用户想要的
-
push-and-pull?:
- Kafka中的Producer和consumer采用的是push-and-pull模式,即Producer只管向broker push消息,consumer只管从broker pull消息,两者对消息的生产和消费是异步的