kfafka的特性分析

一、kafka是什么
类JMS消息队列,结合JMS中的两种模式(点对点模型,发布者/订阅者模型),能够有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据。
kafka是一个生产-消费模型。mysql


Producer:生产者,只负责数据生产,生产者的代码能够集成到任务系统中。 
数据的分发策略由producer决定,默认是defaultPartition Utils.abs(key.hashCode) % numPartitions算法


Broker:当前服务器上的Kafka进程。只管数据存储,无论是谁生产,无论是谁消费。
在集群中每一个broker都有一个惟一brokerid,不得重复。sql


Topic:目标发送的目的地,这是一个逻辑上的概念,落到磁盘上是一个partition的目录。partition的目录中有多个segment组合(index,log)
一个Topic对应多个partition[0,1,2,3],一个partition对应多个segment组合。一个segment有默认的大小是1G。
每一个partition能够设置多个副本(replication-factor 1),会从全部的副本中选取一个leader出来。全部读写操做都是经过leader来进行的。
特别强调,和mysql中主从有区别,mysql作主从是为了读写分离,在kafka中读写操做都是leader。缓存


ConsumerGroup:数据消费者组,ConsumerGroup能够有多个,每一个ConsumerGroup消费的数据都是同样的。
能够把多个consumer线程划分为一个组,组里面全部成员共同消费一个topic的数据,组员之间不能重复消费。

二、kafka生产数据时的分组策略
默认是defaultPartition Utils.abs(key.hashCode) % numPartitions
上文中的key是producer在发送数据时传入的,produer.send(KeyedMessage(topic,myPartitionKey,messageContent))服务器

三、kafka如何保证数据的彻底生产
ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。
0:不等待broker返回确认消息
1:等待topic中某个partition leader保存成功的状态反馈
-1:等待topic中某个partition 全部副本都保存成功的状态反馈

四、broker如何保存数据
在理论环境下,broker按照顺序读写的机制,能够每秒保存600M的数据。主要经过pagecache机制,尽量的利用当前物理机器上的空闲内存来作缓存。
当前topic所属的broker,一定有一个该topic的partition,partition是一个磁盘目录。partition的目录中有多个segment组合(index,log),
但每一个段segment file消息数量不必定相等,这种特性方便old segment file快速被删除。默认保留7天的数据。并发

五、partition如何分布在不一样的broker上
int i = 0
list{kafka01,kafka02,kafka03}

for(int i=0;i<5;i++){
  brIndex = i%broker;
  hostName = list.get(brIndex)
}

六、consumerGroup的组员和partition之间如何作负载均衡
最好是一一对应,一个partition对应一个consumer。
若是consumer的数量过多,必然有空闲的consumer。

算法:负载均衡

当一个group,consumer加入或者离开时,会触发partitions均衡.均衡的最终目的,是提高topic的并发消费能力,步骤以下:ide

一、 假如topic1,具备以下partitions: P0,P1,P2,P3大数据

二、 加入group,有以下consumer: C1,C2spa

三、 首先根据partition索引号对partitions排序: P0,P1,P2,P3

四、 根据consumer.id排序: C0,C1

五、 计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)

六、 而后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],Ci = [P(i * M),P((i + 1) * M -1)]

 

七、如何保证kafka消费者消费数据是全局有序的
伪命题
若是要全局有序的,必须保证生产有序,存储有序,消费有序。
因为生产能够作集群,存储能够分片,消费能够设置为一个consumerGroup,要保证全局有序,就须要保证每一个环节都有序。
只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用场景相悖。


数据有序的讨论?
一个partition的数据是不是有序的? 间隔性有序,不连续
针对一个topic里面的数据,只能作到partition内部有序,不能作到全局有序。
特别加入消费者的场景后,如何保证消费者消费的数据全局有序的?伪命题。

只有一种状况下才能保证全局有序?就是只有一个partition。

相关文章
相关标签/搜索