kafka学习一:概念总结

转载:https://blog.csdn.net/u012050154/article/details/78269869

1、Kafka是一个【消息订阅-发布系统】

        由消息生产者(Producer)和消息消费者(Consumer)组成,Producer将消息推送(Push)到Kafka集群,Consumer从Kafka集群中将消息拉取(Pull)下来。客户端和服务端通过TCP协议进行通信。

========================================

        

2、Kafka对消息【以Topic为单位】进行归类

        每个Topic可以认为是一类消息,不同的Topic之间是相互独立的。

        每个Topic将被分成多个区(Partition---在Topic创建时指定),每个Partition存在一部分的消息,在存储层面是Append Log文件,任何Push到此Partition的消息都会被直接追加到Log文件的尾部,每条消息在文件中的位置称为Offset(long类型的数据),它唯一标记一条消息。比如创建了一个名为page_visit的Topic、有5个Partition,则在Kafka的数据目录中有这个5个目录:page_visit-0、page_visit-1、page_visit-2、page_visit-3、page_visit-4(其命名规则就是<topic_name>-<partition_id>),每个目录下存储的就是partition的数据。 

        分区(Partition)的目的:使得每个Log的数量不会太大可以在单个服务上保存,同时每个分区可以单独进行消息的发布和消费,使得可以并发操作Topic。

        因此,每个Consumer唯一需要维护的数据就是消息在日志中的位置,即上面的Offset。可以认为Offset是Partition中的消息的id,这样Partition中的每条消息应该包含三个属性:(1)offset;(2)MessageSize;(3)Data。

        随着Consumer对消息的消费,Offset值不断增大。由于分区中的消息即使被消费,消息还没有被立即删除,所以我们可以将Offset值设置成为一个旧的值来重新读取之前的消息。所以,Kafka Consumer是非常轻量级的,在不对集群和其他Consumer造成影响的情况下读取消息。(消息被处理的状态是在Consumer端维护的,当失败时能自动平衡)

        无论消息是否被消费,消息并不是立即被删除,Kafka都会保留所有消息。Kafka根据服务中的配置,有两种策略可,以删除旧数据:(1)基于时间:log.retention.hours=168;(2)基于文件大小:log.retention.bytes=1073741824。通过这两种简单的方式释放磁盘空间、减少消息消费后对文件内容改动的磁盘IO开销。

3、Kafka是一个【分布式的、可分区的、可复制的消息系统】

        Kafka以集群的方式运行,可以由一个或多个服务器组成,每个服务器叫一个Broker,每个服务器可以容纳多个Topic。Partition是物理上的概念,每个Topic包含一个或多个Partition(为实现扩展性,一个非常大的Topic可以分布在到多个Broker上,一个Topic可以分为多个Partition,每个Partition有一个有序的队列,Partition中的生条消息都会被)分配一个有序的id【offset】,Kafka只保证一个Partition中的顺序,不保证整个Topic之间的顺序)。

        每个Partition在Kafka集群的若干服务中都有副本,这样这些持有副本的服务可以共同处理数据和请求,副本的数量是可以配置的。基于多个副本,则每个Patition都有一个服务器作为Leader,零或多个服务器作为Follower,Leader负责所有的读写操作,如果Leader失效则从Follower选举新的Leader;Follower只是同步Leader的消息。所以说,Leader承载了全部的请求压力,因此从集群的整体考虑,有多少个Partitions就应该有多少个Leader,Kafka会将Leader均衡的分散在每个实例上,以保证系统整体的性能稳定。

4、Producer消息生产者  

        Producer将消息发布到指定的Topic中,同时负责决定发布到哪个Patition。基于负载均衡机制随机选择分区或者其他算法选择分区。

5、Consumer消息消费者

        发布消息通常有两种模式:队列模式(Queuing)和发布-订阅模式(Publish-Subscribe)。如果所有Consumer都在同一Consumer Group中则为队列模式,消息在Consumer之间负载均衡;如果所有Consumer都在不同Consumer Group中则为发布-订阅模式,所有消息分发到所有的Consumer Group中。队列模式中,Consumer可以同时从服务端读取消息,每个消息只被其中一个Consumer消费;发布-订阅模式中,消息被广播到所有Consumer Group中,Consumer加入Consumer Group中,共同竞争一个Topic,只有一个Consumer可以消费。同一组中的Consumer可以在不同的程序中,也可以在不同的机器上。

        Consumer Group消费者群组,一个Topic可以有多个Consumer Group,Topic的消息会复制到所有Consumer Group上,但每个Consumer Group只会把该消息发给其中一个Consumer。即所有Group中数据都是Topic全量的消息,同一个Group内部只有一个消费者能消费到这条消息。

        本质上Kafka只支持Topic,每个Consumer只属于一个Consumer Group,每个Group由多个Consumer组成,发送到Topic的消息只会被订阅此Topic的每个Group中的一个Consumer消费。这样,一个消息只允许一个消费者消费就失去了并发性,因此通过将每个Parition只分给一个Consumer Group的方式(保证一个Partition内消息的有序性)实现多个Consumer Group之间的负载均衡。由上知道:

(1)Consumer Group中的消费者的数量不能多于分区的数量,即有多少个分区就允许多少的并发消费;

那么Partition与Consumer Group的关系如何呢?总结如下:

a)消费者多于Partition。同一个Partition内的消息只能被同一个Consumer Group中的一个Consumer消费,当消费者数量多于Partition数量时,多余的消费者空闲;【如Topic=test1,Parition=1,Consumer Group=g1,g=1{c1,c2},则向test1中发消息,则c1能接收消息c2接收不到消息;而当Partition=4时,最多允许4个消费者均衡消费】;

b)消费者小于等于Partition。消息由同组内的消费者分别消费;【如Top=test2,Partition=3,Consumer Group=g2,g2={c1,c2},则向test2中发消息,c1、c2分别消费对应Partition的消费】;

c)多个消费群组。【如Topic=test3,Partition=3,Consumer Group={g3,g4}, g3={c1,c2,c3},g4={c4},则g3和g4都有Topic的所有消息,但同一Group内的消费只被其中一个消费者消费】;

(2)发送到Parition中的消息将会按它接收的顺序追加到日志中;

(3)消费消息的顺序和日志中消息顺序一致;        

6、Broker服务器

        缓存代理,指Kafka集群中的一台或多台服务器。

7、其他的特点

(1)高吞吐率:消息的读写不在内存中,充分利用磁盘的顺序读写,减少IO操作步骤;数据批量处理;每个Topic分成多个Partition提高并发处理能力;

(2)负载均衡:Producer采用算法将消息发送到指定Partition;每个Partition有自己的备份,不同备份在不同Broker上;多Partition由Leader负责读写、Follower负责同步消息;

(3)可扩展性:通过Zookeeper管理Broker与Consumer的动态加入/离开
 

猜你喜欢

转载自blog.csdn.net/qq_33366098/article/details/86846213