一、简介
kafka是一个分布式流处理平台,是由Scala编写具有高水平扩展和高吞吐量的分布式消息系统。kafka对消息保存时根据topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
二、kafka两种消息模型
1.点对点模型(一对一,消费者主动拉取数据,消息收到后消息清除):点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求消息,而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者处理,即使有多个消息监听者也是如此。
2.发布/订阅模式(一对多,数据生产后,推送给所有订阅者):发布订阅模型则是一个基于推送的消息传送模型。发布订阅模型可以有多种不同的订阅者,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息即使当前订阅者不可用,处于离线状态。
三、kafka组件的概念
kafka服务器(Broker):kafka的服务器端被称为Broker的腹部进程构成,即一个kafka集群是由多个Broker组成,Broker负责接收和处理客户端发送过来的请求,以及对消息进行持久化。
生产者(Producers):生产者往某个topic上发布消息,生产者也负责选择发布到topic上的哪一个分区。最简单的方式是从分区列表中进行轮询选择,也可以根据某种算法依照权重选择分区,开发者负责如何选择分区算法。
消费者(Consumers):消息消费者,向kafka取消息的客户端
消费者组(Consumer Group):消费者使用一个消费组名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例。消费者实例可以分布在多个进程中或者多个机器上。即使不指定消费组,会分配一个默认的消费组。
如果所有的消费者实例在同一个消费组中,消息记录会负载平衡到每一个消费者实例。
如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程。
对于第一种描述,当C1,C2在同一个组中,取消费P0时,那么消费会平衡的发送给C1,C2,也就是C1一条,C2一条,一人一条;对于第二种描述,当C1,C3处于不同的消费者组,取消费P0时,P0中的消息会同时发送给C1,C3。
主题(Topics):是数据记录发布的地方,可以用来区分业务系统。kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
分区(Partition):可以将一个主题分为多个分区(partition),每个partition是一组有序的消息日志,生产者产生的消息只会发送到topic中的某一个分区。分区机制解决了kafka的扩展性问题。
偏移量(Offset):kafka的存储文件都是按照offset.kafka来命名的,用offset做名字的好处是方便查找。例如想查找位于2049的位置,只要找到2048.kafka(是从0来时命名的)的文件即可。
备份机制(Replication):partition被分布部署到多个服务器上,每个处理器处理自己的分区,然后根据配置每个分区还可以复制到其它服务器作为备份容错。每个分区有一个leader,零或多个follower。Leader处理此分区的所有读写请求,而follower被动的复制数据。如果leader宕机,其它的一个follower会被推举为新的leader。备份机制保证了kafka的持久化和消息不丢失问题。遵循的策略如下:
同一个partition的多个replication不允许在同一个broker上。
每个partition的replication中,有一个leader,零或多个follower。
leader处理此分区对的所有的读写请求,follower仅仅是用来做备份数据的。
leader宕机后,会从follower中选举出新的leader。
对于上述的基本描述,kafka可分为三层消息架构:
第一层是主题层,每个主题可以有多个分区,每个分区又有多个副本文件。
第二层是分区层,每个分区的多个副本中,有且只能有一个是领导者,对外提供服务;其他追随者副本,只是用来提供数据冗余备份使用。
第三层是消息层,分区中包含多个消息,每条消息的位移从0开始,依次递增。
欢迎关注本人公众号,一起讨论学习