一、关于Kafka的基本概念
Kafka是一个分布式实时数据流平台,可以独立部署在单台服务器上,也可以部署在多台服务器上构成集群。它提供了发布与订阅功能,用户可以发送数据到Kafka集群中,也可以从Kafka集群中读取数据。
二、Kafka中有几个核心的概念:
①、代理(Broker)
在Kafka集群中,一个kafka进程(Kafka进程又称为Kafka实例)被称为一个代理(Broker)节点。
代理节点是消费队列中的一个常用概念,通常,在部署分布式kafka集群时,一台服务器上部署一个Kafka实例。
②、生产者(Producer)
在Kafka系统中,生产者通常被称为Producer。
Prouducer将消息记录发送到Kafka集群指定的主题(Topic)中进行存储,同时生产者(Producer)也能通过自定义算法决定将消息记录发送到哪个分区(Partition)。
例如:通过获取消息记录主键(Key)的哈希值,然后使用该值对分区数取模运算,得到分区索引,计算公式如下:
java代码如下:
int partition = Math.abs(key.hashCode()) % numPartitions;
③、消费者(Consumer)
消费者(Consumer)从Kafka集群指定的主题(Topic)中读取消息记录。
在读取主题数据时,需要设置消费组名(GroupId),如果不设置,则Kafka消费者会默认生成一个消费组名称。
④、消费者组(Consumer Group)
消费者程序在读取Kafka系统主题(Topic)中的数据时,通常会使用多个线程来执行。
一个消费者组可以包含一个或多个消费者程序,使用多分区和多线程模型可以极大提高读取数据的效率。
注意:
一般而言,一个消费者对应一个线程。
在给应用程序设置线程数量时,遵循“线程数小于等于分区数”原则。如果线程数大于分区数,则多余的线程不会消费分区中的数据,这样会造成资源浪费。
⑤、主题(Topic)
Kafka系统通过主题来分区不同业务类型的消息记录。
例如:用户登录数据存储在主题A中,用户充值记录存储在主题B中,则如果应用程序只订阅了主题A,而没有订阅主题B,那该应用程序只能读取主题A中的数据。
⑥、分区(Partition)
每一个主题(Topic)中可以有一个或者多个分区(Partition),在Kafka系统的设计思想中,分区是基于物理层面上的,不同的分区对应着不同的数据文件。
Kafka通过分区(Partition)来支持物理层面上的并发读写,以提高Kafka集群的吞吐量。
每个主题(Topic)下的各个分区(Partition)中存储数据的具体流程如图所示:
1、每个分区(Partition)内部的消息记录是有序的,每个消息都有一个连续的偏移量序号(Offset)。
2、一个分区只对应一个代理节点(Borker),一个代理节点可以管理多个分区。
⑦、副本(Replication)
在Kafka中,每个主题(Topic)在创建时会要求指定它的副本数,默认是1,通过副本(Replication)机制来保证Kafka分布式集群数据的高可用性。
注意:
在创建主题时,主题的副本系数值应如下设置:
(1)、若集群数量大于等于3,则主题的副本系数值可以设置为3;
(2)、若集群数量小于3,则主题的副本系数值可以设置为小于等于集群数量值。
例如:集群数为2,则副本系数可以设置为1或者2,集群数为1,则副本系数只能设置为1。
通常情况下,当集群数量大于等于3时,为了保证集群数据不丢失,会将副本系数值设置为3,集群数量大于等于3时,副本系数值也可以设置为1或者2,但是会存在数据丢失的风险。
好吧,今天到这了,明天见~~