天天看点

kafka

1、kafka是什么

apache kafka是一个开源消息系统,由scala写成

kafka最初是由linkedin开发,并于2011年初开源

kafka是一个分布式消息队列:生产者消费者的功能。它提供了类似于jms的特性,但是在设计实现上完全不同,此外它并不是jms规范的实现

kafka对消息保存时根据topic进行分类,发送消息者称为producer,消息接受者称为consumer,此外kafka集群有多个kafka实例组成,每个实例称为broker

无论是kafka集群还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统的可用性

jms:jms是java提供的一套技术规范。

    可以用来异构系统集成通信,缓解系统瓶颈,提高系统的伸缩性增强系统用户体验,使得系统模块化和组件化变得可行并更加灵活。

类jms消息队列,结合jms中的两种模式,可以有多个消费者主动拉取数据,在jms中只有点对点模式才有消费者主动拉取数据。

kafka

kafka是一个生产-消费模型。

    01.producer:生产者

        只负责数据生产,生产者的代码可以集成到任务系统中。 数据的分发策略由producer决定,默认是defaultpartition  utils.abs(key.hashcode) % numpartitions

    02.broker:

        当前服务器上的kafka进程,俗称拉皮条。只管数据存储,不管是谁生产,不管是谁消费。在集群中每个broker都有一个唯一brokerid,不得重复。

    03.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。

    04.consumergroup:

        数据消费者组,consumergroup可以有多个,每个consumergroup消费的数据都是一样的。

        可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据,组员之间不能重复消费。

        (在下面代码配置文件中,可以设置groupid和读取的位置)

    05.zookeeper

        依赖集群保存meta信息(每次读取到哪的信息)。

kafka

2、kafka生产数据时的分组策略

    默认是defaultpartition  utils.abs(key.hashcode) % numpartitions

    上文中的key是producer在发送数据时传入的,produer.send(keyedmessage(topic,mypartitionkey,messagecontent))

3、kafka如何保证数据的完全生产

    ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。

    0:不等待broker返回确认消息

    1:等待topic中某个partition leader保存成功的状态反馈

    -1:等待topic中某个partition 所有副本都保存成功的状态反馈

4、broker如何保存数据

    在理论环境下,broker按照顺序读写的机制,可以每秒保存600m的数据。主要通过pagecache机制,尽可能的利用当前物理机器上的空闲内存来做缓存。

    当前topic所属的broker,必定有一个该topic的partition,partition是一个磁盘目录。partition的目录中有多个segment组合(index,log)

5、partition如何分布在不同的broker上

    int i = 0

    list{kafka01,kafka02,kafka03}

    for(int i=0;i<5;i++){

        brindex = i%broker;

        hostname = list.get(brindex)

    }

6、consumergroup的组员和partition之间如何做负载均衡

    最好是一一对应,一个partition对应一个consumer。

    如果consumer的数量过多,必然有空闲的consumer。

    算法:

        假如topic1,具有如下partitions: p0,p1,p2,p3

        加入group中,有如下consumer: c1,c2

        首先根据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)]

7、如何保证kafka消费者消费数据是全局有序的

    伪命题

    如果要全局有序的,必须保证生产有序,存储有序,消费有序。

    由于生产可以做集群,存储可以分片,消费可以设置为一个consumergroup,要保证全局有序,就需要保证每个环节都有序。

    只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用场景相悖。

8.kafka生产数据

9.kafka消费数据(低阶)

10.kafka和zookeeper使用javaapi能够拉取到数据(高阶消费)

properties配置文件

kafka配置文件(注意groupid)

然后在spring配置文件中import kafka的配置文件

java接收: