这节主要记录一下消息队列中的Kafka的学习过程。
Kafka 的特点
Kafka 是一种分布式的,基于发布 / 订阅的消息队列系统。主要设计目标如下:
- 以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。
- 支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展。
Kafka 的使用场景
-
活动跟踪:Kafka 可以用来跟踪用户行为,比如我们经常回去淘宝购物,你打开淘宝的那一刻,你的登陆信息,登陆次数都会作为消息传输到 Kafka ,当你浏览购物的时候,你的浏览信息,你的搜索指数,你的购物爱好都会作为一个个消息传递给 Kafka ,这样就可以生成报告,可以做智能推荐,购买喜好等。
-
传递消息:Kafka 另外一个基本用途是传递消息,应用程序向用户发送通知就是通过传递消息来实现的,这些应用组件可以生成消息,而不需要关心消息的格式,也不需要关心消息是如何发送的。
-
度量指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
-
日志记录:Kafka 的基本概念来源于提交日志,比如我们可以把数据库的更新发送到 Kafka 上,用来记录数据库的更新时间,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
-
流式处理:流式处理是有一个能够提供多种应用程序的领域。
-
限流削峰:Kafka 多用于互联网领域某一时刻请求特别多的情况下,可以把请求写入Kafka 中,避免直接请求后端程序导致服务崩溃。
Kafka 基本概念
Topic : 逻辑队列,不同 topic 可以建立不同的 Partition,所有数据都存储到 topic 中
Cluster : 物理集群,每个集群中可以建立多个不同的 Topic
Producer : 生产者,负责将业务消息发送到 Topic 中
Consumer : 消费者,负责消费 Topic 中的消息
ConsumerGroup : 消费组,不同消费组的 Consumer 进度不一样。
partition : topic 的分区,一个 topic 有多个分区,不同分区的消息可以并发处理,提高单个 topic 的吞吐能力。
Topic
一个 Topic 里可以建立不同的 Partiton, partition 内存储不同的消息。
Offset:消息在 partition 内的相对位置信息,可以理解为唯一ID,在 partition 内部严格递增。
Partition
每个分区有多个 Replica , 多个 Replica 分布在集群不同的机器上,以此达到容灾的作用,且副本还有不同的角色 (Leader, Fllower),其中Leader Replica 将会从 ISR (红色框内的In-Sync Replicas)中选出
Producer
生产者: 向主题发布消息的客户端应用程序称为生产者(Producer),生产者用于持续不断的向某个主题发送消息。
Consumer
消费者:订阅主题消息的客户端程序称为消费者(Consumer),消费者用于处理生产者产生的消息。
Kafka 的消息队列
Kafka 的消息队列一般分为两种模式:点对点模式和发布订阅模式
Kafka 是支持消费者群组的,也就是说 Kafka 中会有一个或者多个消费者,如果一个生产者生产的消息由一个消费者进行消费的话,那么这种模式就是点对点模式
如果一个生产者或者多个生产者产生的消息能够被多个消费者同时消费的情况,这样的消息队列成为发布订阅模式的消息队列
Kafka 为何如此之快
Kafka 实现了零拷贝原理来快速移动数据,避免了内核之间的切换。Kafka 可以将数据记录分批发送,从生产者到文件系统(Kafka 主题日志)到消费者,可以端到端的查看这些批次的数据。
批处理能够进行更有效的数据压缩并减少 I/O 延迟,Kafka 采取顺序写入磁盘的方式,避免了随机磁盘寻址的浪费,更多关于磁盘寻址的了解,请参阅 程序员需要了解的硬核知识之磁盘 。
总结一下四个要点
- 顺序读写
- 零拷贝
- 消息压缩
- 分批发送
参考资料 真的,Kafka 入门一篇文章就够了 - 掘金 (juejin.cn) Kafka【入门】就这一篇! - 知乎 (zhihu.com)