1. 什么是消息队列,有哪些服务可以作为消息队列服务使用
消息队列是一种分布式系统中常用的通信机制,用于在不同的组件或服务之间传递数据。它通过引入一个中间层(即消息队列)来解耦生产者和消费者,使得生产者可以将消息发送到队列中,而不需要关心消费者是否已经准备好处理这些消息。消费者则可以从队列中取出消息并进行处理。
消息队列的主要特点:
异步处理:生产者和消费者可以独立运行,无需同步等待。
解耦:生产者和消费者之间不需要直接通信,降低了系统的耦合度。
可靠性:消息队列通常提供持久化功能,确保消息不会丢失。
流量削峰:可以在高并发情况下缓冲大量请求,避免下游系统过载。
顺序保证:某些消息队列支持消息的有序传递。
常见的消息队列服务:
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 的依赖?
从 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 主要版本及演进
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)数量应根据业务需求和容错能力进行选择。以下是常见推荐配置:
推荐做法:
生产环境建议至少使用 3 个 Broker;
若需更高可用性,可扩展至 5 个 Broker;
不推荐偶数个节点(如 4、6),因为未提升容错能力却增加资源消耗。
8. 强一致性与最终一致性有什么区别
强一致性(Strong Consistency) 和 最终一致性(Eventual Consistency) 是分布式系统中描述数据一致性的两种模型,它们在数据同步方式、响应速度和适用场景上有显著区别。
一、定义与核心区别
二、工作原理对比
强一致性(Strong Consistency)
写操作必须在所有副本上成功提交后才返回成功;
读操作总是返回最新数据;
常用于对数据准确性要求极高的场景(如金融交易、库存管理等);
最终一致性(Eventual Consistency)
写操作只需在一个节点成功即可返回;
其他副本异步复制更新;
在数据同步完成前可能出现“旧数据”;
常用于高并发、可容忍短暂不一致的场景(如社交网络、日志系统等);
9. 为什么 ZooKeeper 使用强一致性,而 Kafka 使用最终一致性
ZooKeeper 和 Kafka 在一致性模型上的选择,本质上是基于它们的设计目标和使用场景的不同。以下是详细分析:
一、为什么 ZooKeeper 使用强一致性?
设计目标:
分布式协调服务(Distributed Coordination Service)
提供高可靠性的元数据管理、服务发现、分布式锁、Leader 选举等功能。
核心特性:
CP 系统:在 CAP 定理中选择了 Consistency(一致性) 和 Partition Tolerance(分区容忍性)
所有写操作必须在大多数节点确认后才提交
客户端读取的数据总是最新的
原因分析:
性能代价:
写入性能较低(需要同步复制)
节点故障时可能影响可用性(需等待重新选举)
因此,ZooKeeper 适用于对一致性要求极高、可容忍短暂不可用的场景。
二、为什么 Kafka 使用最终一致性?
设计目标:
高吞吐量的消息队列系统
支持大规模数据流处理、日志聚合、事件溯源等
核心特性:
AP 系统:在 CAP 中选择了 Availability(可用性) 和 Partition Tolerance(分区容忍性)
数据异步复制,允许写入成功后延迟同步
消费者只能读取到已提交的数据,但可能不是“最新”
原因分析:
Kafka 的一致性机制:
ISR(In-Sync Replica)机制:只有 ISR 中的副本才能被选为 Leader
min.insync.replicas:控制最小同步副本数,确保至少有一定数量的副本保持同步
unclean.leader.election.enable=false:禁止从非 ISR 副本选举 Leader,防止数据丢失
Kafka 通过这些机制在最终一致性和数据可靠性之间取得平衡。
10. kafka默认使用哪些端口
Apache Kafka 默认使用以下端口:
Kafka Broker 主要端口
Kafka 依赖组件端口
Kafka 其他常见服务端口
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 的消息;
优点:
支持分布式部署;
可控制最终一致性级别;
缺点:
需要额外开发聚合逻辑;
消息可能有短暂乱序,需容忍一定延迟;
5. 使用 Kafka Streams 或 Flink 等流处理框架
原理:
利用 Kafka Streams、Apache Flink 等流式处理引擎提供的窗口机制和事件时间排序功能;
在流处理层统一处理多个 Partition 的消息,并按事件时间重新排序;
优点:
支持大规模实时处理;
提供丰富的状态管理和容错机制;
缺点:
引入新的技术栈;
增加系统复杂性和资源消耗;
18. kafka中的消息会被重复消费吗?如何避免重复消费
在 Apache Kafka 中,消息是否会被重复消费取决于消费者的实现方式、配置以及系统状态。Kafka 本身提供了“至少一次”(At Least Once)的语义保障,这意味着在某些情况下可能会出现重复消费。
一、为什么 Kafka 中的消息可能被重复消费?
以下是导致消息重复消费的主要原因:
二、如何避免 Kafka 消息重复消费?
1. 幂等性处理(推荐)
在业务逻辑中对每条消息进行唯一标识(如
messageId或businessId),并记录已处理过的消息 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 的事务机制;
适用于金融、订单等关键业务场景。
5. 使用 Kafka Streams / Flink 等流处理框架
这些框架内置了 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 数量。
三、消费组与消费者的关系
四、消费组的作用
21. 一个topic可以被多个不同的消费者订阅吗?这些不同的消费者(属于不同消费组)彼此之间会有什么影响吗?如果A消费了一条消息,B还能消费此消息吗?为什么
一、一个 Topic 可以被多个不同的消费者订阅吗?
是的,可以。
在 Apache Kafka 中,一个 Topic 可以被多个消费者实例订阅,而且这些消费者可以属于不同的消费组(Consumer Group)。
每个消费组独立消费该 Topic;
不同消费组之间互不影响;
同一条消息可以被多个消费组分别消费一次。
二、不同消费组之间的消费者会互相影响吗?
不会互相影响。
每个消费组是 Kafka 中消费消息的独立单元,它们有以下特点:
三、如果 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 的主要职责
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(记录)主要包含以下组成部分:
24. kafka中的消息是明文存储的还是加密的,是文本格式还是二进制格式
在 Apache Kafka 中,消息的存储方式取决于生产者写入时的格式和配置。Kafka 本身并不强制规定消息的格式,而是以 字节流(byte stream) 的方式进行存储和传输。
一、Kafka 消息是明文还是加密的?
默认情况下:明文存储
Kafka 不会对消息内容自动加密;
消息是以原始字节形式存储在磁盘上的日志文件中;
如果你使用的是
PLAINTEXT协议通信,则消息在网络上传输时也是明文;
如需加密,可以启用以下机制:
注意:Kafka 自身不提供“消息内容加密”功能,若需加密,必须由生产者/消费者自己处理。
二、Kafka 消息是文本格式还是二进制格式?
Kafka 消息本质是:二进制格式
Kafka 的消息(record)结构如下:
+----------------+
| Offset | --> 分区内的唯一标识符
+----------------+
| Timestamp | --> 时间戳(可选)
+----------------+
| Key (bytes) | --> 可选,用于 Partition 路由
+----------------+
| Value (bytes) | --> 实际数据内容(任意格式)
+----------------+
| Headers | --> 元数据(可选)
+----------------+
Value 字段是 byte[] 类型,可以是:
文本(如 JSON、XML、CSV)
序列化格式(如 Avro、Protobuf、Thrift)
二进制对象(如图片、视频片段、压缩包)