大数据技术Kafka详解:消息队列(Messages Queue)

大数据技术Kafka详解:消息队列(Messages Queue)

一、Kafka概述

Kafka是由LinkedIn公司最初开发的一种分布式、支持分区(Partition)、多副本(Replica)的基于ZooKeeper协调的分布式消息系统。它以Scala语言编写,并于2010年由LinkedIn贡献给了Apache基金会,成为顶级开源项目。Kafka的最大特性是可以实时处理大量数据,以满足各种需求场景,如基于Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎、Web/Nginx日志、访问日志、消息服务等。

二、Kafka的产生背景

在当今社会,各种应用系统诸如商业、社交、搜索、浏览等,像信息工厂一样不断生产出各种信息。在大数据时代,我们面临诸多挑战,如数据的实时处理、高并发访问、数据持久化存储等。这些挑战形成了一个业务需求模型,即生产者生产(Produce)各种信息,消费者消费(Consume)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁------消息系统。从一个微观层面来说,这种需求也可理解为不同的系统之间如何传递消息。Kafka的诞生正是为了解决上述问题,它实现了生产者和消费者之间的无缝连接。

三、Kafka的特性
  1. 高吞吐量、低延迟:Kafka每秒可以处理几十万条消息,其延迟最低只有几毫秒。
  2. 可扩展性:Kafka集群支持热扩展,通过增加新的节点来提高系统的处理能力。
  3. 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失。
  4. 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)。
  5. 日志收集:Kafka可以用来收集各种服务的日志,通过Kafka以统一接口服务的方式开放给各种消费者,如Hadoop、HBase、Solr等。
  6. 消息系统:解耦生产者和消费者、缓存消息等。
  7. 用户活动跟踪:Kafka经常被用来记录Web用户或App用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到Kafka的Topic中,然后订阅者通过订阅这些Topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘。
  8. 运营指标:Kafka也用来记录运营监控数据,包括收集各种分布式应用的数据,生产各种操作的集中反馈,如报警和报告。
  9. 流式处理:如Spark Streaming和Storm事件源。
  10. Consumer Group:各个Consumer可以组成一个组,每个消息只能被组中的一个Consumer消费,如果一个消息可以被多个Consumer消费的话,那么这些Consumer必须在不同的组。
  11. 消息持久化:Kafka中会把消息持久化到本地文件系统中,并且保持极高的效率。
  12. 消息有效期:Kafka会长久保留其中的消息,以便Consumer可以多次消费,当然其中很多细节是可配置的。
  13. 批量发送:Kafka支持以消息集合为单位进行批量发送,以提高push效率。
  14. Push-and-Pull:Kafka中的Producer和Consumer采用的是Push-and-Pull模式,即Producer只管向Broker push消息,Consumer只管从Broker pull消息,两者对消息的生产和消费是异步的。
四、Kafka的核心概念
  1. 架构详情

    Kafka集群由多个Kafka实例组成,每个实例称为Broker。每个Kafka集群内的Broker都有一个不重复的编号。Broker负责接收来自Producer的消息,为消息设置偏移量,并提交消息到磁盘保存。Broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘的消息。

  2. 消息和批(Messages And Batches)

    Kafka的基本数据单元被称为Message(消息),为减少网络开销,提高效率,多个消息会被放入同一批次(Batch)中后再写入。

  3. 主题和分区(Topics And Partitions)

    Kafka的消息通过Topics(主题)进行分类,一个主题可以被分为若干个Partitions(分区),一个分区就是一个提交日志(Commit Log)。消息以追加的方式写入分区,然后以先入先出的顺序读取。Kafka通过分区来实现数据的冗余和伸缩性,分区可以分布在不同的服务器上,这意味着一个Topic可以横跨多个服务器,以提供比单个服务器更强大的性能。

  4. 生产者和消费者(Producers And Consumers)

    • 生产者(Producer):负责创建消息。一般情况下,生产者在把消息均衡地分布到主题的所有分区上,而并不关心消息会被写到哪个分区。如果我们想要把消息写到指定的分区,可以通过自定义分区器来实现。
    • 消费者(Consumer):是消费者群组的一部分,负责消费消息。消费者可以订阅一个或者多个主题,并按照消息生成的顺序来读取它们。消费者通过检查消息的偏移量(Offset)来区分读取过的消息。偏移量是一个不断递增的数值,在创建消息时,Kafka会把它添加到其中,在给定的分区里,每个消息的偏移量都是唯一的。
  5. 服务器和集群(Brokers And Clusters)

    • Broker:一个独立的Kafka服务器。
    • Cluster:集群,由多个Broker组成。每一个集群都会选举出一个Broker作为集群控制器(Controller),集群控制器负责管理工作,包括将分区分配给Broker和监控Broker。在集群中,一个分区(Partition)从属一个Broker,该Broker被称为分区的首领(Leader)。一个分区可以分配给多个Brokers,这个时候会发生分区复制。这种复制机制为分区提供了消息冗余,如果有一个Broker失效,其他Broker可以接管领导权。
五、Kafka的消息队列模式

Kafka是一个分布式的发布-订阅(Pub-Sub)消息系统。在发布-订阅系统中,消息被保留在主题中。消费者可以订阅一个或多个主题并使用该主题中的所有消息。消息生产者称为发布者,消息使用者称为订阅者。

Kafka使用了Pull模式:消费者采用轮询的方式定期去Kafka Broker中进行数据的检索,如果有数据就用来消费,如果没有就再继续轮询等待。

六、Kafka的应用场景
  1. 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败。
  2. 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间。
  3. 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况。
  4. 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理。
七、Kafka与其他消息队列的比较
  1. ActiveMQ:成熟稳定,社区活跃,支持多种消息协议,但在高并发或网络不稳定环境下存在较低概率的数据丢失风险,且单机吞吐量较低。
  2. RabbitMQ:提供了丰富的交换机类型,支持复杂的路由规则,能满足多样化的消息分发需求,但在集群配置与维护上相对繁琐。
  3. RocketMQ:高性能与低延迟,原生支持分布式事务消息,适合金融、电商等对性能、事务处理要求严苛的场景,但社区活跃度和第三方资源略逊于Kafka。
八、总结

Kafka作为一种高吞吐量的分布式发布订阅消息系统,具有高性能、持久化、多副本备份、横向扩展能力等特点,广泛应用于大数据处理、流计算、日志收集、消息服务等领域。通过对其核心概念和特性的深入了解,可以更好地利用Kafka解决各种实际问题。

相关推荐
凸头18 分钟前
RedisSearch 和 Elasticsearch 的 HNSW向量索引对比
大数据·elasticsearch·搜索引擎
Jial-(^V^)21 分钟前
微调大模型实现新闻分类
大数据·人工智能·分类
V搜xhliang02468 小时前
机器人建模(URDF)与仿真配置
大数据·人工智能·深度学习·机器学习·自然语言处理·机器人
房产中介行业研习社8 小时前
2026年3月哪些房源管理系统功能全
大数据·运维·人工智能
玄微云9 小时前
2026年通用软件难适配,垂直店务系统反而更省心
大数据·云计算·软件需求
Elastic 中国社区官方博客9 小时前
Elastic 为什么捐赠其 OpenTelemetry PHP 发行版
大数据·开发语言·elasticsearch·搜索引擎·信息可视化·全文检索·php
方向研究10 小时前
ABS生产
大数据
TDengine (老段)10 小时前
TDengine 视图功能使用
大数据·数据库·servlet·时序数据库·tdengine·涛思数据
TDengine (老段)10 小时前
TDengine IDMP 运维指南 —— 部署架构
大数据·运维·数据库·架构·时序数据库·tdengine·涛思数据
utmhikari11 小时前
【测试人生】变更规则校验Agent研发的一些思路
大数据·人工智能·llm·agent·变更风险·openclaw