KAFKA的个人理解欢迎赏析

本文深入探讨Kafka的工作原理及其核心组件的功能。Kafka是一款高性能的分布式消息系统,能够处理大量的实时数据流。文章详细介绍了Kafka的架构,包括Producer、Consumer、ConsumerGroup等关键概念,并解释了消息持久化、分区机制以及数据读写的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇博客说过近期做的交易日志剥离,准备了三个方案,第一个是RestTemplate,第二就是
kafka,其三是PostMethod,因为找了不少资料,将kafka的运行原理之类的看了一边,此篇
就着重讲解kafka是怎么工作的及kafka的几个模块各及有什么用处。

什么是kafka

Kafka 是分布式发布-订阅消息系统。它最初由 LinkedIn 公司开发,使用 Scala语言编写,之后成为 Apache 项目的一部分。Kafka 是一个分布式的,可划分的,多订阅者,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。

kafka的优点

  1. 消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。
  2. 可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失。
  3. 分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。
  4. 同时为发布和订阅提供高吞吐量。据了解,Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)
  5. kafka采用的是文本日志有序的方式来记录信息的,和内存没有关系,全部将接受的信息持久化到硬盘上,接收和消费互不影响,大大提高了IO效率

kagka的逻辑架构

这里写图片描述

如上图

  1. Producer 特指消息的生产者
  2. Consumer 特指消息的消费者
  3. Consumer Group 消费者组,可以并行消费Topic中partition的消息
  4. Broker:缓存代理,Kafa 集群中的一台或多台服务器统称为 broker
  5. Topic:特指 Kafka 处理的消息源(feeds of messages)的不同分类
  6. Partition:Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。
  7. Message:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。
  8. Producers:消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。
  9. Consumers:消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。

个人对此处的理解

每个Broker都是一个节点,Broker对映这一个id,集群每个Broker的id不能一致,两个
Broker及以上就形成了集群,每个Broker之间可以建立多个topic,不同的topic之间存不
同的日志文件,看认为交易的,外围数据的,可以按项目模块划分为多个topic,每个
topic之间还可以分多个Partition,日志文件就是记录在Partition上的,读操作不会阻塞
写操作和其他操作,数据大小不对性能产生影响;没有容量限制(相对于内存来说)
的硬盘空间建立消息系统; 线性访问磁盘,速度快,可以保存任意一段时间。
每个信息在被Partition的时候都会存在一个偏移量(offset),相当与这个数据的索引,
并且kafka用的是稀疏索引,这样就保证了索引的大小要比日志文件小很多,不至于占
更多硬盘,每个Partition都是一份独立的文件,另一方面也防止linux限制了的文件大小,
导致数据无法插入。
这里写图片描述

稀疏索引
这里写图片描述

Kafka的Message组成##

  1. Message消息:是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。
  2. Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。
  3. partition中的每条Message包含了以下三个属性:
    offset 对应类型:long
    MessageSize 对应类型:int32
    data 是message的具体内容

Kafka的Consumers##

  1. 消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。

  2. 在 kafka中,我们 可以认为一个group是一个“订阅者”,一个Topic中的每个partions,只会被一个“订阅者”中的一个consumer消费,不过一个 consumer可以消费多个partitions中的消息(消费者数据小于Partions的数量时)

  3. kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息.

即partitions与consumer 是多对一的关系,不能是一对多。

事务传输的定义

  1. at most once: 最多一次,这个和JMS中"非持久化"消息类似.发送一次,无论成败,将不会重发.
  2. at least once: 消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功.
  3. exactly once: 消息只会发送一次.

生产中消费者fetch消息,然后处理消息,然后保存offset.如果消息处理成功之后,但是在保存
offset阶段zookeeper异常导致保存操作未能执行成功,这就导致接下来再次fetch时可能获
得上次已经处理过的消息,这就是"at least once",原因offset没有及时的提交给
zookeeper,zookeeper恢复正常还是之前offset状态.因为大多只采用第二次的情况,
毕竟日志只是统计的,而且多存储总一条数据比数据丢失要好的多。

总结

kafka的存储系统采用的是线性的访问磁盘直接将数据写入到日志文件中,写操作:通过将数据追加到文件中实现,读操作:读的时候从文件中读就好了,.Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天,可配置)后会被删除,由于broker并不保存消息状态,所以接收到的消息并不知道有没
有被消费,现在kafka用的都是zookeeperr集群,zookeeper上会保存最新消费的信息的索
引。这样就保证了服务器重启后,也能从zookeeper上准确的获取没有消费的记录的索引,
broker接收的信息不会主动发送给消费者,这样也减轻了broker的服务压力,他只会通知zookeeper,zookeeper会通知消费者,消费者会主动过来拉取数据进行消费。

集群通信方式

这里写图片描述

broker上消息的接收和消费可以采用异步的方式,可以指定当消息存储带一定条数,或者一
定大小的时候再进行存储或者被消费,这样可以减少IO次数,减轻服务器压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值