一文读懂:Kafka生产者,消费者,主题,代理的核心概念

[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
代码案例地址: ?https://github.com/Mydreamandreality/sparkResearch


一文读懂系列:kafka的核心概念

kafka的术语

  • 上一章我们已经了知道了kafka中的一些术语,
  • 比如:消费者,生产者,主题,这章主要是着重的解释这些术语的含义
组件术语 说明
主题(Topics) kafka的消息是存储在主题中的,主题被拆分成分区
分区(partition) 主题可能有N多的分区,因此它可以处理任意数量的数据
分区偏移(partition offset) 每个分区消息具有称为:"offset"的唯一标识
分区备份(Replicas of partition) 分区备份,备份不读取或者写入数据
经纪人:代理(Brokers) 简单的说,代理是维护发布数据的系统,更容易理解的说代理就是消息队列本身,一个代理指的就是一个 kafkaserver,那么数据就会先给代理,消费者从代理中消费数据
kafka集群 多个代理组合起来就是集群啦,可以热扩展,无需停机,
生产者(producers) 生产者就是给kafka主题发送数据的,每次生产者把数据给代理的时候,代理都会把消息附加到最后一个段文件,并且被附加到分区,生产者还可以向指定的分区发送消息
消费者(consumers) 消费者从代理读取数据,可以订阅一个或者多个主题
领导者(leader) leader就是负责指定分区的写入和读取的节点,每个分区都有一个服务器作为leader
追随者(follower) 跟随领导者指令的节点被称为Follower,如果领导失败,一个追随者将自动成为新的领导者

Kafka的集群架构如下图所示

在这里插入图片描述

组件名词 说明
代理 kafka的集群由多个代理组成以保持负载均衡,kafka的代理是无状态的,所以需要zookeeper维护集群状态,kafka的leader选举可以由zookeeper完成
zookeeper zookeeper主要是协调kafka代理,如果有新代理或者代理失效,zookeeper会接收到该信息,然后生产和消费者采取决定并且和其他代理协调它们的任务
生产者 生产者把数据推送给代理
消费者 kafka代理是无状态的.所以需要消费者通过分区偏移维护已经消耗多少消息,如果消费者确认特定的消息偏移,则意味消费者已经消费了先前所有的消息,消费者异步向代理发出拉取请求,以及准备好消耗的字节缓冲区,消费者可以通过偏移量快速的跳到分区中的任何点,偏移值由zookeeper通知

偏移量汇编语言中的定义为:
把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”。 亦: 存储单元的实际地址与其所在段的段地址之间的距离。本质其实就是“实际地址与其所在段的段地址之间的距离”
更通俗一点讲,内存中存储数据的方式是:
一个存储数据的“实际地址”=段首地址+偏移量


Kafka小案例:


前提:

  • 首先保证我们的kafka和zookeeper正常启动
  • [启动和安装可以参考上一章的内容] ?点击跳转
  • 输入jps验证当前的进程
  • 如下图所示,Kafka,Zookeeper进程正常,QuorumPeerMain是zookeeper的核心启动类
    在这里插入图片描述

jps是JDK1.5提供的用于查看当前Java程序进程PID的命令


创建主题

代码案例

  • kafka给我们提供了一个bin/kafka-topics.sh命令,我们用这个命令就可以在服务器上创建主题了

我们创建一个名称是HelloW orld的主题
命令中我们使用本地的zookeeper创建了一个分区和一个副本
这种也叫作单节点单代理模式
进入kafka bin/目录,执行如下命令

./kafka-topics.sh --create --zookeeper localhost:2181 
--replication-factor 1  --partitions 1 --topic HelloWorld

如下图所示:创建好之后会有create topics helloworld的提示
在这里插入图片描述

获取主题列表

如何获取刚才创建的主题,代码案例

./kafka-topics.sh --list --zookeeper localhost:2181

如下图所示:获取到 HelloWorld
在这里插入图片描述

创建生产者,发送数据到指定主题

刚才我们创建了一个名叫HelloWorld的主题,kafka的消息是存储在主题中的,所以我们现在要发送数据到HelloWorld主题中

代码案例:

  • 使用kafka-console-producer.sh命令创建生产者
./kafka-console-producer.sh --broker-list localhost:9092 
--topic HelloWrold

如下图所示:
我们需要使用该命令创建一个代理列表,此处为9092,以及发送的主题
在这里插入图片描述

创建好生产者后,我们就可以在命令下输入要传输的消息了,
默认情况一行为一条数据,如下图所示:

在这里插入图片描述

启动消费者,消费消息

上面我们生产信息,那么此处就该消费信息了

代码案例

  • kafka给我们提供了kafka-console-consumer.sh命令,以此启动消费者
./kafka-console-consumer.sh --bootstrap-server localhost:9092
 --topic HelloWorld --from-beginning

以上案例是单节点单代理的模式,多节点多代理的生产者和消费者操作和以上的案例基本是一样的,只是需要多配置几个文件,创建主题时需要指定分区和副本参数,后续用到再说

后续更新 kafka的JavaApi,还有和Spark如何集成使用

发布了55 篇原创文章 · 获赞 329 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/youbitch1/article/details/89513419