1. 什么是消息队列,有哪些服务可以作为消息队列服务使用

消息队列是一种分布式系统中常用的通信机制,用于在不同的组件或服务之间传递数据。它通过引入一个中间层(即消息队列)来解耦生产者和消费者,使得生产者可以将消息发送到队列中,而不需要关心消费者是否已经准备好处理这些消息。消费者则可以从队列中取出消息并进行处理。

消息队列的主要特点:

  1. 异步处理:生产者和消费者可以独立运行,无需同步等待。

  2. 解耦:生产者和消费者之间不需要直接通信,降低了系统的耦合度。

  3. 可靠性:消息队列通常提供持久化功能,确保消息不会丢失。

  4. 流量削峰:可以在高并发情况下缓冲大量请求,避免下游系统过载。

  5. 顺序保证:某些消息队列支持消息的有序传递。

常见的消息队列服务:

1. RabbitMQ

  • 特点:轻量级、易于部署、支持多种协议(如AMQP)、丰富的插件系统。

  • 适用场景:适合需要复杂路由规则的企业级应用。

  • 优点:成熟稳定,社区活跃,文档丰富。

  • 缺点:性能不如Kafka等现代消息队列。

2. Apache Kafka

  • 特点:高性能、可扩展性强、支持大规模数据流处理。

  • 适用场景:大数据实时处理、日志聚合、事件溯源等。

  • 优点:吞吐量极高,支持水平扩展,具备强大的容错能力。

  • 缺点:配置和管理相对复杂,学习曲线较陡。

3. Amazon Simple Queue Service (SQS)

  • 特点:由AWS提供的托管服务,支持标准HTTP协议。

  • 适用场景:适用于AWS生态系统内的微服务架构。

  • 优点:完全托管,自动扩展,按需付费。

  • 缺点:依赖于AWS平台,跨云迁移困难。

4. Google Cloud Pub/Sub

  • 特点:由Google Cloud提供的全托管消息传递服务,支持发布/订阅模型。

  • 适用场景:适用于Google Cloud上的微服务架构。

  • 优点:高可用性,低延迟,集成良好。

  • 缺点:同样受限于特定云平台。

5. Microsoft Azure Service Bus

  • 特点:微软Azure提供的企业级消息队列服务,支持队列和主题/订阅模式。

  • 适用场景:适用于Azure平台上的应用程序。

  • 优点:与Azure其他服务无缝集成,安全性强。

  • 缺点:主要面向Azure用户,跨云迁移不便。

6. Redis Streams

  • 特点:Redis从4.0版本开始引入的轻量级消息队列功能。

  • 适用场景:适用于简单的消息传递需求,尤其是对延迟要求较高的场景。

  • 优点:简单易用,性能优异,适合轻量级应用。

  • 缺点:相比专业消息队列,功能较为有限。

7. ActiveMQ

  • 特点:老牌的消息中间件,支持JMS和AMQP等多种协议。

  • 适用场景:传统企业级应用,特别是Java生态中的项目。

  • 优点:功能齐全,支持多种协议,社区历史悠久。

  • 缺点:性能和可扩展性不如Kafka等新一代消息队列。

8. Pulsar

  • 特点:由Yahoo开发并开源,后来成为Apache顶级项目,具有多租户支持和灵活的架构。

  • 适用场景:适用于需要多租户支持和跨地域复制的大型分布式系统。

  • 优点:支持多租户,架构灵活,性能优异。

  • 缺点:相对较新,社区规模较小。

总结:

选择合适的消息队列服务取决于具体的业务需求、技术栈以及对性能、可靠性和成本的要求。对于需要高性能和大规模数据处理的场景,Kafka是一个非常好的选择;而对于需要简单易用且成本较低的解决方案,Redis Streams或RabbitMQ可能更为合适。如果使用的是公有云环境,可以选择对应的托管消息队列服务(如AWS SQS、Google Pub/Sub、Azure Service Bus),以减少运维负担。


2. 如果把redis作为消息队列使用会有什么缺点

将 Redis 用作消息队列虽然在某些轻量级场景下是可行的,但它并不是专门为消息队列设计的系统,因此存在一些局限性和潜在缺点。以下是使用 Redis 作为消息队列时可能遇到的问题:


1. 功能有限

Redis 的消息队列功能主要依赖于其 List、Pub/Sub 或 Streams 数据结构实现,缺乏专业消息队列(如 Kafka、RabbitMQ)提供的丰富功能:

  • 不支持复杂的路由规则:无法像 RabbitMQ 那样灵活地配置交换器和绑定规则。

  • 不支持延迟消息:除非手动实现或借助第三方库。

  • 缺乏重试机制:没有内置的消息失败重试机制。

  • 无死信队列(DLQ):无法自动处理多次失败的消息。


2. 消息持久化能力较弱

尽管 Redis 支持持久化(AOF 和 RDB),但其设计初衷是作为内存数据库使用,因此在消息持久化方面不如专业的消息中间件可靠:

  • 数据丢失风险:如果在未持久化前发生宕机,可能导致消息丢失。

  • 性能与持久化的权衡:开启 AOF 持久化会显著影响性能。


3. 吞吐量与扩展性不足

  • 单实例性能瓶颈:Redis 是单线程处理命令(虽然从 Redis 6 开始引入了 I/O 多线程),在高并发写入场景下可能成为瓶颈。

  • 集群模式限制:虽然 Redis Cluster 支持分片,但其槽位机制更适合缓存场景,而非消息队列的顺序读写需求。


4. 消息顺序性难以保证

  • 消费者竞争问题:多个消费者同时拉取消息时,无法保证严格的顺序消费。

  • 消息确认机制缺失:不像 Kafka、RabbitMQ 提供 ACK/NACK 机制来确保消息被正确消费。


5. 缺乏高级特性支持

  • 无回溯消费:Kafka 支持从任意偏移量重新消费历史消息,而 Redis Streams 虽然部分支持,但不如 Kafka 灵活。

  • 无事务机制:Redis 不支持类似 Kafka 的事务性消息。

  • 监控与运维工具较少:缺少成熟的管理控制台和可视化监控平台。


6. 资源消耗问题

  • 内存占用高:Redis 将所有数据保存在内存中,对于大数据量的消息队列来说成本较高。

  • 频繁 GC 压力:大量短期消息可能导致频繁的内存回收操作,影响性能。


7. 可靠性与容错性较差

  • 主从复制延迟:在 Redis 主从架构中,可能存在复制延迟导致故障切换时消息丢失。

  • 哨兵/集群切换复杂:相比专业消息队列的副本机制,Redis 的高可用方案在消息队列场景下显得不够成熟。


8. 不适合大规模数据流处理

  • 日志聚合、事件溯源等场景不适用:Redis 更适合小规模、低延迟的实时通信,而不适合用于日志收集、大数据管道等需要高吞吐、可持久化存储的场景。



3. 什么是解耦,微服务属于解耦吗

解耦是指在软件开发中,减少模块之间依赖关系的过程。通过解耦,可以提高系统的灵活性、可维护性和可扩展性。解耦的目标是使一个模块的更改不会影响到其他模块,从而使得系统更容易开发、测试和部署。

微服务架构是一种将单个应用程序拆分为多个小型服务的方法,每个服务运行在其独立的进程中,并通过轻量级通信机制(如HTTP API)进行交互。微服务架构本质上是为了实现更高的解耦度和松耦合。每个微服务都可以独立地开发、部署、扩展和维护,而不会影响到其他服务。

因此,可以说微服务属于解耦的一种实现方式。它们通过将复杂的单体应用分解为更小、更独立的服务来实现解耦。这种架构允许团队专注于特定的功能领域,并且可以根据需要单独更新或扩展这些功能,而不必担心对整个系统造成广泛的影响。


4. 什么是异步,什么是同步。

同步(Synchronous)异步(Asynchronous) 是描述任务执行方式的两个概念,主要区别在于任务是否需要等待前一个操作完成。


一、同步(Synchronous)

在同步模式下,任务是按顺序执行的。当前任务必须等待前一个任务完成后才能开始执行。这种模式简单直观,但效率较低,因为每一步都需要等待上一步完成。

特点:

  • 按顺序执行

  • 有阻塞,需要等待上一步完成

  • 适用于任务之间有关联、依赖性强的场景

二、异步(Asynchronous)

在异步模式下,任务可以并行执行。当前任务不需要等待前一个任务完成就可以开始执行。这种方式提高了程序的响应速度和效率,常用于网络请求、文件读写等耗时操作。

特点:

  • 并行执行

  • 无阻塞,任务可以同时进行

  • 适用于高并发、实时性要求高的场景


5. kakfa为什么要移除对zk的依赖,在哪个版本之后完全移除了zk

一、为什么要移除对 ZooKeeper 的依赖?

1. 简化架构,降低运维复杂度

  • Kafka 早期使用 ZooKeeper 来管理元数据(如 Broker 信息、Topic 分布等),但这也导致了 Kafka 需要同时维护两个系统:Kafka 自身和 ZooKeeper。

  • 维护 ZooKeeper 带来了额外的部署、配置、监控和故障排查成本。

  • 移除 ZK 后,Kafka 可以统一元数据管理,简化部署和运维流程。

2. 提高可扩展性与性能

  • ZooKeeper 在大规模集群中容易成为瓶颈。它不适合处理高频写操作,而 Kafka 对元数据的频繁变更(如分区状态变化)会导致 ZK 成为性能瓶颈。

  • 移除 ZK 后,Kafka 使用内置的 KRaft(Kafka Raft Metadata)协议 来管理元数据,支持更高的写吞吐量和更好的扩展性。

3. 提升容错能力

  • Kafka 与 ZooKeeper 是两个独立的服务,ZooKeeper 的故障或网络问题可能导致 Kafka 不可用。

  • 使用 KRaft 后,Kafka 元数据管理更紧密集成在 Kafka 内部,提高了系统的整体健壮性和一致性。

4. 适应云原生环境

  • 在 Kubernetes 等云原生环境中,ZooKeeper 的部署和管理较为复杂,而 KRaft 更适合容器化部署和自动化管理。

  • 移除 ZK 有助于 Kafka 更好地融入现代云平台和自动化运维体系。


二、Kafka 在哪个版本之后完全移除了对 ZooKeeper 的依赖?

版本

特性说明

Apache Kafka 2.8(2021 年 4 月发布)

引入 KRaft 模式(实验性),允许不依赖 ZooKeeper 运行 Kafka。

Apache Kafka 3.3(2022 年 6 月发布)

KRaft 模式进入稳定阶段,支持生产环境使用。

Apache Kafka 3.4(2023 年 1 月发布)

官方宣布移除对 ZooKeeper 的支持,推荐使用 KRaft 模式部署新集群。

从 Kafka 3.4 开始,官方不再支持基于 ZooKeeper 的部署方式。


6. kafka有哪些主要版本?是什么语言开发的,依赖什么环境

Apache Kafka 是一个分布式流处理平台,主要由 Java 和 Scala 开发。它依赖于一定的运行环境和组件来正常工作。


一、Kafka 的开发语言

  • 开发语言

    • Java(主要用于核心模块)

    • Scala(早期版本中大量使用,后续版本逐步减少)

当前 Kafka 已经逐步从 Scala 迁移到 Java,但仍有部分组件使用 Scala 编写。


二、Kafka 的运行依赖

1. JVM(Java Virtual Machine)

  • Kafka 依赖 JVM 运行,推荐使用 JDK 8 或更高版本

  • 生产环境中建议使用 JDK 11 或 JDK 17,以获得更好的性能和安全性支持。

2. ZooKeeper(仅适用于 3.4 之前的版本)

  • Kafka 3.4 及之前版本 中,Kafka 使用 ZooKeeper 管理元数据(如 Broker、Topic、Partition 信息等)。

  • Kafka 3.4 起,官方已移除对 ZooKeeper 的依赖,转而使用内置的 KRaft 模式管理元数据。

3. 操作系统支持

  • Kafka 支持主流操作系统:

    • Linux(最常用)

    • Windows(适合开发测试)

    • macOS

4. 磁盘与网络

  • 需要高性能的磁盘存储(SSD 推荐)用于持久化消息。

  • 需要稳定的网络环境,确保节点之间通信顺畅。


三、Kafka 主要版本及演进

版本

发布时间

核心特性 / 变化

0.x 系列

早期版本

初期功能实现,未广泛生产使用

1.0.0

2017 年

正式稳定版本,API 冻结,适合生产环境

2.0.0

2018 年

引入新指标、改进授权机制

2.1.0

2019 年

提升事务支持,优化 Exactly-Once 语义

2.8.0

2021 年

引入 KRaft 模式,开始支持无 ZooKeeper 启动

3.0.0

2021 年

移除 Scala 编译器依赖,进一步向 Java 迁移

3.1.0 ~ 3.3.0

2022 年

KRaft 模式进入稳定阶段,支持生产环境

3.4.0

2023 年

正式移除对 ZooKeeper 的支持,全面转向 KRaft 模式

3.6.x

2024 年

增强安全特性、优化性能、支持更多云原生场景


7. kafka实现了CAP中的哪两个,推荐几个节点

Apache Kafka 在分布式系统理论中主要实现了 CAP 定理中的 CP(Consistency & Partition Tolerance),牺牲了部分 A(Availability)。


一、Kafka 与 CAP 理论

C - Consistency(一致性)

  • Kafka 保证写入的消息被所有副本确认后才视为提交成功;

  • 使用 ISR(In-Sync Replica)机制确保消费者只能读取到已提交的消息;

  • 在 Leader 故障时,仅从 ISR 中选举新 Leader,确保数据一致性。

P - Partition Tolerance(分区容忍性)

  • Kafka 是为分布式环境设计的,天然支持网络分区;

  • 即使在节点或网络故障情况下,也能通过副本机制恢复服务;

  • 依赖 ZooKeeper 或 KRaft 实现元数据一致性与协调。

A - Availability(可用性)

  • 在发生网络分区或 Leader 不可用时,Kafka 可能暂时不可用(如等待 ISR 恢复);

  • 为了保证一致性,Kafka 不会在非 ISR 副本上提供读写服务;

  • 因此,在极端情况下会牺牲部分可用性来保障一致性。


二、Kafka 推荐的集群节点数量

Kafka 的节点(Broker)数量应根据业务需求和容错能力进行选择。以下是常见推荐配置:

节点数

容错能力

适用场景

1

无容错

单机测试环境

2

可容忍 1 个节点故障

小型开发/测试环境

3

可容忍 1 个节点故障

典型生产环境最小配置

5

可容忍 2 个节点故障

大型系统或跨数据中心部署

7

可容忍 3 个节点故障

极高可用性要求的超大规模系统

推荐做法:

  • 生产环境建议至少使用 3 个 Broker

  • 若需更高可用性,可扩展至 5 个 Broker

  • 不推荐偶数个节点(如 4、6),因为未提升容错能力却增加资源消耗。


8. 强一致性与最终一致性有什么区别

强一致性(Strong Consistency)最终一致性(Eventual Consistency) 是分布式系统中描述数据一致性的两种模型,它们在数据同步方式、响应速度和适用场景上有显著区别。


一、定义与核心区别

对比维度

强一致性(Strong Consistency)

最终一致性(Eventual Consistency)

定义

任何读操作都能读到最新的写操作结果

数据更新后,经过一段时间才能保证所有副本一致

同步方式

同步复制,写入必须在所有副本完成才成功

异步复制,写入一个节点即可返回成功

延迟

高(需要等待所有副本确认)

低(只需本地确认即可)

可用性

相对较低(部分节点故障可能导致不可用)

高(即使部分节点故障也可继续提供服务)

一致性保障

实时一致性

最终达成一致性,但中间状态可能不一致

CAP 理论归属

CP(Consistency & Partition Tolerance)

AP(Availability & Partition Tolerance)

二、工作原理对比

强一致性(Strong Consistency)

  • 写操作必须在所有副本上成功提交后才返回成功;

  • 读操作总是返回最新数据;

  • 常用于对数据准确性要求极高的场景(如金融交易、库存管理等);

最终一致性(Eventual Consistency)

  • 写操作只需在一个节点成功即可返回;

  • 其他副本异步复制更新;

  • 在数据同步完成前可能出现“旧数据”;

  • 常用于高并发、可容忍短暂不一致的场景(如社交网络、日志系统等);


9. 为什么 ZooKeeper 使用强一致性,而 Kafka 使用最终一致性

ZooKeeper 和 Kafka 在一致性模型上的选择,本质上是基于它们的设计目标和使用场景的不同。以下是详细分析:


一、为什么 ZooKeeper 使用强一致性?

设计目标:

  • 分布式协调服务(Distributed Coordination Service)

  • 提供高可靠性的元数据管理、服务发现、分布式锁、Leader 选举等功能。

核心特性:

  • CP 系统:在 CAP 定理中选择了 Consistency(一致性)Partition Tolerance(分区容忍性)

  • 所有写操作必须在大多数节点确认后才提交

  • 客户端读取的数据总是最新的

原因分析:

场景

强一致性必要性

服务注册与发现

若不同客户端看到的注册信息不一致,可能导致服务调用失败或重复注册

分布式锁

如果允许最终一致性,可能会导致多个客户端同时获得锁,破坏互斥性

Leader 选举

必须保证所有节点对当前 Leader 的认知一致,否则会导致脑裂问题

配置中心

配置变更必须立即生效,避免旧配置导致业务异常

性能代价:

  • 写入性能较低(需要同步复制)

  • 节点故障时可能影响可用性(需等待重新选举)

因此,ZooKeeper 适用于对一致性要求极高、可容忍短暂不可用的场景。


二、为什么 Kafka 使用最终一致性?

设计目标:

  • 高吞吐量的消息队列系统

  • 支持大规模数据流处理、日志聚合、事件溯源等

核心特性:

  • AP 系统:在 CAP 中选择了 Availability(可用性)Partition Tolerance(分区容忍性)

  • 数据异步复制,允许写入成功后延迟同步

  • 消费者只能读取到已提交的数据,但可能不是“最新”

原因分析:

场景

最终一致性优势

消息队列

高并发写入需求大,若采用强一致性会严重影响吞吐量

日志收集

允许短暂延迟,优先保证系统的可用性和吞吐能力

事件溯源(Event Sourcing)

只要最终数据一致即可,中间状态可接受延迟

流式处理

更关注实时消费能力而非绝对一致性

Kafka 的一致性机制:

  • ISR(In-Sync Replica)机制:只有 ISR 中的副本才能被选为 Leader

  • min.insync.replicas:控制最小同步副本数,确保至少有一定数量的副本保持同步

  • unclean.leader.election.enable=false:禁止从非 ISR 副本选举 Leader,防止数据丢失

Kafka 通过这些机制在最终一致性和数据可靠性之间取得平衡。


10. kafka默认使用哪些端口

Apache Kafka 默认使用以下端口:


Kafka Broker 主要端口

端口

协议

用途说明

9092

TCP

Kafka Broker 的默认监听端口,用于客户端(Producer/Consumer)连接和数据传输

9091

TCP

可选的 SSL 加密通信端口(常用于安全连接)

9093

TCP

可选的 SASL 认证端口(用于 Kerberos 或其他认证机制)

Kafka 依赖组件端口

组件

端口

用途说明

ZooKeeper(旧版本)

2181

Kafka 3.4 之前版本使用 ZooKeeper 存储元数据

ZooKeeper 集群内部通信

2888

Follower 与 Leader 通信端口

ZooKeeper Leader 选举端口

3888

节点间进行 Leader 选举使用的端口

KRaft(Kafka Raft)模式(3.4+)

19091

控制器通信端口(替代 ZooKeeper)


Kafka 其他常见服务端口

服务

端口

用途说明

Schema Registry(Confluent 平台)

8081

用于管理 Avro、Protobuf 等消息格式

Kafka Connect

8083

用于集成外部系统(如数据库、HDFS)

Kafka REST Proxy

8082

提供 HTTP 接口访问 Kafka(生产环境慎用)

Kafka MirrorMaker

9092

用于跨集群复制数据

Kafka Streams 应用

动态分配

嵌入在应用中,默认无固定端口


11. 使用3个节点搭建4.x版本的kafka


12. kafka中什么是生产者,什么是消费者

在 Apache Kafka 中,生产者(Producer)消费者(Consumer) 是两个核心概念,分别用于描述消息的发布和订阅行为。


1. 生产者(Producer)

  • 定义
    生产者是向 Kafka 主题(Topic)中写入数据的应用程序或服务。它可以将数据以消息的形式发送到指定的主题中。

  • 主要功能

    • 将数据封装成 Kafka 消息(message);

    • 决定将消息发送到哪个主题(Topic)以及对应的分区(Partition);

    • 支持同步或异步发送消息;

    • 可配置消息确认机制(如 acks)、重试策略等。

  • 使用场景

    • 数据采集(日志、事件、传感器数据等);

    • 实时流处理系统的输入端。

2. 消费者(Consumer)

  • 定义
    消费者是从 Kafka 主题中读取数据的应用程序或服务。它可以从一个或多个主题中消费消息,并进行相应的处理。

  • 主要功能

    • 订阅一个或多个 Kafka 主题;

    • 从指定的分区中拉取消息;

    • 支持自动提交偏移量(offset),确保消息不会重复消费或丢失;

    • 支持消费者组(Consumer Group)机制,实现负载均衡和高可用。

  • 使用场景

    • 实时数据分析;

    • 日志监控与告警;

    • 事件溯源系统。


13. 在mysql里数据写入到库中的表中。kakfa里数据写入什么中?

1. MySQL 数据写入对象:表(Table)

  • 表是关系型数据库中最基本的数据存储单元。

  • 每张表由行(记录)和列(字段)组成。

  • 数据通过 SQL 语句(如 INSERT, UPDATE)写入到具体的表中。

2. Kafka 数据写入对象:主题(Topic)

  • 主题(Topic)是 Kafka 中消息的逻辑分类单位,类似于数据库中的“表”。

  • 生产者将消息发送到指定的 Topic;

  • 消费者从 Topic 中读取消息;

  • 每个 Topic 可以分为多个分区(Partition),实现并行处理和数据冗余。


14. 什么是topic,什么是partition,一个topic可以有多少个partition

1. 什么是 Topic?

  • 定义
    Topic 是 Kafka 中消息的逻辑分类单位,类似于数据库中的“表”或文件系统中的“文件夹”。
    所有消息都必须发送到某个具体的 Topic,消费者也从特定的 Topic 中读取消息。

  • 作用

    • 按照业务需求对数据进行分类;

    • 提供多租户能力,不同服务可以使用不同的 Topic;

    • 支持高并发和水平扩展。

  • 示例

    • user_activity:记录用户行为日志;

    • order_events:记录订单状态变更;

    • sensor_data:采集传感器数据。


2. 什么是 Partition?

  • 定义
    Partition 是 Topic 的物理分片,每个 Topic 可以划分为多个 Partition。
    每个 Partition 是一个有序、不可变的消息序列,存储在磁盘上,并具有唯一的偏移量(offset)。

  • 作用

    • 实现并行处理:多个 Partition 允许生产者和消费者并行读写;

    • 提高吞吐量:每个 Partition 可以分布在不同的 Broker 上;

    • 数据冗余与容错:通过副本机制(Replication)实现高可用。

  • 特性

    • 每个 Partition 必须完全属于一个 Broker;

    • 同一 Partition 内的消息是有序的;

    • 不同 Partition 之间的消息顺序无法保证。


3. 一个 Topic 可以有多少个 Partition?

  • 理论上限
    Kafka 对单个 Topic 的最大 Partition 数没有硬性限制。


15. 创建一个有1个分区的topic,并创建一个生成者创建消息,创建一个消费者来消费消息


16. kafka中的消息是有序的吗?消费者会按照时间来消费吗?

在 Apache Kafka 中,消息的有序性和消费者的消费顺序是一个非常关键的话题。下面从几个方面来详细说明:


1. Kafka 中的消息是否有序?

在一个 Partition 内部:消息是有序的

  • 每个 Partition 是一个追加写入(append-only)的有序日志

  • 消息在 Partition 内按照写入顺序被分配唯一的偏移量(offset);

  • 生产者发送的消息会按发送顺序依次写入 Partition。

跨 Partition 或 Topic:无法保证全局有序

  • 不同 Partition 之间的消息没有顺序关系;

  • 多个消费者并行消费不同 Partition 时,无法保证整体顺序;

  • 如果需要严格有序,只能使用单 Partition(但牺牲并发和吞吐能力)。


2. 消费者会按照时间来消费吗?

默认行为:消费者按照 offset 的顺序消费消息

  • Kafka 消费者默认是从每个 Partition 的 offset 顺序读取消息;

  • 如果生产者是按时间顺序写入的,那么消费者也是“按时间顺序”读取;

  • 即使消费者暂停或重启,也可以从上次提交的 offset 继续消费。

注意:

  • 消费者的消费顺序与生产者写入顺序一致,而不一定是物理时间顺序

  • 如果多个消费者并行消费不同的 Partition,它们之间的时间顺序是无法保证的


17. 如何确保多个分区的消息能够按照时间顺序依次消费

在 Apache Kafka 中,默认情况下无法保证多个分区(Partition)之间的消息顺序性。每个 Partition 是一个独立的、有序的日志,但不同 Partition 之间没有顺序关系。

如果你希望跨多个 Partition 的消息也能按照时间顺序依次消费,需要结合以下策略进行设计和实现:


1. 使用单个 Partition(牺牲并发性和吞吐量)

  • 原理:将 Topic 设置为只有 1 个 Partition

  • 优点:所有消息都在同一个 Partition 内,消费者按 offset 顺序读取,天然有序;

  • 缺点

    • 消费只能串行处理,无法利用多核 CPU;

    • 吞吐量受限,不适合高并发场景;

  • 适用场景:对顺序要求极高、数据量小、实时性要求不高的系统。

2. 使用 Key 确保相同业务实体的消息进入同一 Partition

  • 原理:生产者发送消息时指定 key,Kafka 使用 key.hashCode % partitionCount 将相同 key 的消息路由到同一个 Partition;

  • 优点

    • 同一 key(如用户 ID、订单 ID)的消息保持顺序;

    • 可以支持多个 Partition 和并行消费;

  • 缺点

    • 不同 key 的消息之间仍无顺序;

    • 若 key 分布不均,可能导致 Partition 数据倾斜;

3. 消费者端排序(引入外部协调服务)

  • 原理:消费者从多个 Partition 并行消费,然后在消费端引入中间缓冲队列或排序机制(如 Redis、ZooKeeper、etcd);

  • 优点

    • 支持大规模并发消费;

    • 可实现全局顺序;

  • 缺点

    • 架构复杂度上升;

    • 增加了延迟和运维成本;

  • 适用场景:金融交易、审计日志等对顺序极其敏感的业务。


4. 时间戳 + 消费者组同步消费

  • 原理

    • 生产者为每条消息添加时间戳;

    • 消费者组内多个消费者各自消费自己的 Partition;

    • 引入一个“聚合层”组件,按时间戳合并来自多个 Partition 的消息;

  • 优点

    • 支持分布式部署;

    • 可控制最终一致性级别;

  • 缺点

    • 需要额外开发聚合逻辑;

    • 消息可能有短暂乱序,需容忍一定延迟;


  • 原理

    • 利用 Kafka Streams、Apache Flink 等流式处理引擎提供的窗口机制和事件时间排序功能;

    • 在流处理层统一处理多个 Partition 的消息,并按事件时间重新排序;

  • 优点

    • 支持大规模实时处理;

    • 提供丰富的状态管理和容错机制;

  • 缺点

    • 引入新的技术栈;

    • 增加系统复杂性和资源消耗;


18. kafka中的消息会被重复消费吗?如何避免重复消费

在 Apache Kafka 中,消息是否会被重复消费取决于消费者的实现方式、配置以及系统状态。Kafka 本身提供了“至少一次”(At Least Once)的语义保障,这意味着在某些情况下可能会出现重复消费。


一、为什么 Kafka 中的消息可能被重复消费?

以下是导致消息重复消费的主要原因:

原因

描述

消费者崩溃或重启

消费者处理完消息但未提交 offset 就宕机,下次启动时会从上次提交的 offset 开始重新消费。

网络问题或超时

生产者发送消息后未收到 Kafka 的确认响应,重试机制导致消息重复写入。

offset 提交失败

消费者在处理完消息后提交 offset 失败,例如 Kafka 不可用或 offset 存储失败。

消费者组再平衡

消费者实例加入/离开消费者组时触发再平衡(rebalance),可能导致部分消息被重复消费。


二、如何避免 Kafka 消息重复消费?

1. 幂等性处理(推荐)

  • 在业务逻辑中对每条消息进行唯一标识(如 messageIdbusinessId),并记录已处理过的消息 ID;

  • 使用 Redis、数据库或其他持久化存储来去重。

2. 使用 Kafka 的事务机制(适用于 Kafka 0.11+)

  • Kafka 支持事务性生产者和消费者,可以保证消息只处理一次(Exactly Once);

  • 需要开启 Kafka 的事务支持,并启用 enable.idempotence=true

3. 手动提交 offset(而非自动提交)

  • 默认情况下 Kafka 使用自动提交 offset(enable.auto.commit=true),这可能导致消息在处理前就提交;

  • 可以关闭自动提交,改为在消息处理完成后手动提交 offset。

4. 结合外部系统事务控制

  • 如果消费者将数据写入数据库或其他系统,可以使用两阶段提交(Two-phase Commit)或借助 Kafka Streams 的事务机制;

  • 适用于金融、订单等关键业务场景。

  • 这些框架内置了 Exactly-Once 语义支持;

  • 通过窗口机制、状态管理、事件时间排序等方式,进一步提升消息处理的精确性和一致性。


19. kakfa中是如何记录消费情况的?什么是offset,offset是消费者管理,还是生产者管理

在 Apache Kafka 中,消息的消费情况是通过 offset(偏移量)来记录的。offset 是 Kafka 实现高吞吐、持久化和消息顺序管理的关键机制之一。


1. 什么是 Offset?

  • Offset 是 Kafka Partition 内部每条消息的唯一递增序号

  • 它表示该消息在 Partition 中的位置(类似于数组索引);

  • 消费者通过 offset 来标识自己已经消费到哪个位置;

  • Kafka 不会自动删除消息,而是根据配置保留一段时间或大小后自动清理。

2. Offset 是谁管理的?

Offset 是由消费者管理的。

  • Kafka 本身不主动推进 offset;

  • 消费者在处理完一批消息后,可以选择是否提交 offset;

  • 提交方式可以是自动提交(默认)或手动提交

  • Offset 存储在 Kafka 的一个内部 Topic:__consumer_offsets 中。


20. 什么是消费组,跟消费者有什么关系

在 Apache Kafka 中,消费组(Consumer Group)消费者(Consumer) 是两个紧密相关的核心概念。它们共同构成了 Kafka 的消息分发机制和负载均衡模型。


一、什么是消费组(Consumer Group)?

  • 定义:消费组是一组消费者的逻辑集合;

  • 同一个消费组中的消费者实例共同消费某个 Topic 的消息;

  • Kafka 保证每个 Partition 只能被消费组内的一个消费者消费;

  • 消费组之间互不影响,可以独立消费同一个 Topic。

二、什么是消费者(Consumer)?

  • 定义:消费者是实际读取消息的客户端;

  • 它属于某个消费组,并负责处理分配给它的 Partition;

  • 一个消费组中可以有多个消费者,但不能超过该 Topic 的 Partition 数量。


三、消费组与消费者的关系

特性

说明

消费组包含多个消费者

同一组内消费者共同消费 Topic,实现并行消费

Partition 分配策略

Kafka 根据消费组自动将 Partition 分配给组内消费者

负载均衡机制

当消费者加入或离开消费组时,Kafka 触发再平衡(Rebalance),重新分配 Partition

offset 管理粒度

offset 是按消费组 + Topic + Partition 维度记录的

跨消费组独立消费

不同消费组可以独立消费同一 Topic,互不影响


四、消费组的作用

作用

描述

并行消费

多个消费者组成一个组,共同消费多个 Partition,提高吞吐量

故障转移

若某个消费者崩溃,其负责的 Partition 会重新分配给其他消费者

消息不共享

同一消费组内,每条消息只被一个消费者消费

跨组隔离

不同消费组可独立消费相同的消息流,适合多下游系统订阅场景


21. 一个topic可以被多个不同的消费者订阅吗?这些不同的消费者(属于不同消费组)彼此之间会有什么影响吗?如果A消费了一条消息,B还能消费此消息吗?为什么

一、一个 Topic 可以被多个不同的消费者订阅吗?

是的,可以。

在 Apache Kafka 中,一个 Topic 可以被多个消费者实例订阅,而且这些消费者可以属于不同的消费组(Consumer Group)

  • 每个消费组独立消费该 Topic;

  • 不同消费组之间互不影响;

  • 同一条消息可以被多个消费组分别消费一次。


二、不同消费组之间的消费者会互相影响吗?

不会互相影响。

每个消费组是 Kafka 中消费消息的独立单元,它们有以下特点:

特性

是否受影响

Offset 提交

每个消费组有自己的 offset 记录

Partition 分配策略

每个消费组独立进行再平衡和分配

消息消费进度

彼此独立,互不干扰

消费行为

A 组消费过的消息不影响 B 组再次消费

三、如果 A 消费者消费了一条消息,B 消费者还能消费这条消息吗?

是的,只要 A 和 B 属于不同的消费组,B 就能消费到这条消息。

Kafka 的设计原则是:

  • 消息不会因为某个消费组消费过就被删除或标记为已读;

  • 每个消费组都有自己的消费进度(offset);

  • 因此,即使 A 消费组已经消费了某条消息,B 消费组仍然可以读取并处理它。

四、为什么 Kafka 支持这种机制?

这是 Kafka 被广泛用于构建多下游系统架构的关键原因之一。例如:

  • 日志收集系统:A 消费组用于实时分析,B 消费组用于持久化存储;

  • 实时计算与离线计算分离:Flink 实时处理 + Spark 离线批处理;

  • 多业务系统订阅:订单服务、风控系统、推荐引擎等各自独立消费同一个 Topic。


22. Kafka 中的节点被称为什么?主要负责什么内容

一、什么是 Kafka Broker?

  • Broker 是 Kafka 集群中的一个独立节点

  • 每个 Broker 是一个 Kafka 实例(即运行 kafka-server-start.sh 启动的进程);

  • 多个 Broker 组成一个 Kafka 集群;

  • 每个 Topic 可以分布在多个 Broker 上,实现数据分片与高可用。


二、Broker 的主要职责

职责

描述

消息存储

存储属于该 Broker 的 Partition 数据(包括日志文件和索引)

消息读写

接收生产者发送的消息,并为消费者提供消息拉取服务

元数据管理

在 KRaft 模式下,部分 Broker 被指定为 Controller,负责集群元数据管理(如 Topic 创建、Partition 分配等)

副本同步

如果是某个 Partition 的 Leader,负责接收写入请求;如果是 Follower,则从 Leader 同步数据

消费组协调

协助消费组进行再平衡(Rebalance),分配 Partition 给消费者

Offset 管理

作为 Kafka 内部 Topic __consumer_offsets 的一部分,维护消费者的 Offset 信息


23. kafka中的event是什么,每个event中会包含哪些内容

在 Apache Kafka 中,event(事件) 是一个逻辑概念,通常指代生产者发送到 Kafka Topic 的一条消息(message)。每条 event 本质上就是一个记录(record),它代表了某个业务场景中发生的事件实例,例如用户登录、订单创建、设备上报数据等。


一、Kafka 中的 Event 是什么?

  • Event = Record = Message

  • 每个 Event 是 Kafka 中最小的数据单元;

  • 它是生产者写入 Topic 的基本单位;

  • 消费者从 Topic 中读取的就是一个个 Event;

在 Kafka 的官方术语中,也常使用“Record”来描述这个概念。但在实际业务中,“Event” 更多用于表达业务语义,比如“用户注册事件”。


二、每个 Event 包含哪些内容?

Kafka 的每个 Event(记录)主要包含以下组成部分:

组成部分

描述

Key(键)

可选字段,用于决定该消息被分配到哪个 Partition(如 user_id, order_id

Value(值)

必填字段,表示事件的实际内容(可以是 JSON、Avro、字符串等格式)

Timestamp(时间戳)

可选,表示事件发生的时间,默认由 Kafka Broker 添加或由生产者指定

Headers(头部信息)

可选元数据,可用于携带上下文信息(如 trace ID、版本号等)

Offset(偏移量)

Kafka 自动为每条消息分配的唯一序号,标识其在 Partition 中的位置


24. kafka中的消息是明文存储的还是加密的,是文本格式还是二进制格式

在 Apache Kafka 中,消息的存储方式取决于生产者写入时的格式和配置。Kafka 本身并不强制规定消息的格式,而是以 字节流(byte stream) 的方式进行存储和传输。


一、Kafka 消息是明文还是加密的?

默认情况下:明文存储

  • Kafka 不会对消息内容自动加密;

  • 消息是以原始字节形式存储在磁盘上的日志文件中;

  • 如果你使用的是 PLAINTEXT 协议通信,则消息在网络上传输时也是明文;

如需加密,可以启用以下机制:

加密类型

描述

SSL/TLS 通信加密

对生产者、消费者与 Broker 之间的网络通信进行加密,防止中间人攻击

SASL 认证加密

配合 Kerberos、SCRAM 等协议实现身份认证

静态数据加密(Disk Encryption)

使用操作系统或云平台提供的磁盘加密功能保护存储的消息

应用层加密

生产者发送前对消息内容加密(如 AES、RSA),消费者自行解密

注意:Kafka 自身不提供“消息内容加密”功能,若需加密,必须由生产者/消费者自己处理。


二、Kafka 消息是文本格式还是二进制格式?

Kafka 消息本质是:二进制格式

  • Kafka 的消息(record)结构如下:

+----------------+
| Offset         |   --> 分区内的唯一标识符
+----------------+
| Timestamp      |   --> 时间戳(可选)
+----------------+
| Key (bytes)    |   --> 可选,用于 Partition 路由
+----------------+
| Value (bytes)  |   --> 实际数据内容(任意格式)
+----------------+
| Headers        |   --> 元数据(可选)
+----------------+


Value 字段是 byte[] 类型,可以是:

  • 文本(如 JSON、XML、CSV)

  • 序列化格式(如 Avro、Protobuf、Thrift)

  • 二进制对象(如图片、视频片段、压缩包)

以他人的幸福为幸福,以他人的享乐为享乐。