
1) 【一句话结论】针对教师请假申请自动通知辅导员场景,采用Kafka消息队列,配置至少3副本(副本因子3),生产者ACK=all确保消息持久化;通过事务实现跨主题原子操作;消费者端结合分布式唯一标识(如Redis SETNX)和幂等性处理,保证消息不丢失、不重复。
2) 【原理/概念讲解】首先,Kafka的核心是主题(Topic)与分区(Partition)结构。每个主题拆分为多个分区,每个分区有多个副本(Replica)(主副本处理读写,备份副本同步数据)。副本因子(Replication Factor)至少为3,确保数据冗余——即使主副本故障,备份副本可选举为新主,消息不丢失。消息持久化存储在磁盘(Log Append Only模式),避免内存丢失。生产者发送消息时,ACK级别决定确认方式:
3) 【对比与适用场景】
| 对比项 | Kafka | RabbitMQ |
|---|---|---|
| 定义 | 分布式流处理平台,用于构建实时数据管道和事件驱动架构 | 企业级消息队列,支持多种消息模型(队列、主题、交换机),适合微服务解耦 |
| 核心特性 | 高吞吐量、持久化存储、分区与副本、事务、幂等性、流处理 | 基于消息确认(ACK)、死信队列、插件扩展、复杂路由 |
| 使用场景 | 实时数据流处理、日志收集、事件驱动(如请假申请通知)、流应用 | 微服务间异步通信、需要复杂消息路由(如基于规则、死信处理)的场景 |
| 注意点 | 需配置副本数(至少3)、分区数、ACK级别;事务需谨慎使用,避免超时;幂等性需全局唯一标识 | 需手动管理消息确认、死信队列;路由复杂时性能可能下降 |
| 校园OA适配性 | 适合实时通知,高吞吐,持久化,事务支持跨主题操作 | 适合解耦微服务,但路由复杂时可能影响实时性 |
4) 【示例】
生产者端(Java伪代码,事务+幂等性):
producer.beginTransaction(); // 开启事务
producer.send("请假申请", "key", "value", new ProducerRecord("请假申请", "key", "value")); // 发送请假申请
producer.send("通知辅导员", "key", "value", new ProducerRecord("通知辅导员", "key", "value")); // 发送通知
producer.commitTransaction(); // 提交事务
消费者端(Java伪代码,幂等性消费):
consumer.subscribe(Collections.singletonList("请假申请"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
String msgId = record.key(); // 消息唯一标识(如UUID)
// Redis原子判断是否已处理
if (redis.setnx("processed:" + msgId, "1") == 1) {
processLeaveApplication(record.value()); // 处理请假申请
// 处理成功后持久化标识(如更新数据库)
}
}
}
Redis存储示例:
SETNX processed:uuid-12345 true # 原子设置,若已存在则返回0
5) 【面试口播版答案】
面试官您好,针对校园OA系统中教师提交请假申请后自动通知辅导员的需求,我设计Kafka架构如下:首先,我们使用Kafka作为消息队列,将“请假申请”作为主题,教师提交的请假信息(如教师ID、请假原因)作为消息发送到该主题。为了保证消息不丢失,生产者发送消息时选择ACK=all,确保消息被写入所有副本(配置副本因子为3,即至少3个副本,主副本+2个备份副本),同时Kafka采用持久化存储(Log Append Only模式),消息写入磁盘,避免内存丢失。为防止重复通知,生产者配置为幂等模式,过滤重复消息;消费者端通过给每条消息添加唯一标识(如UUID),在处理前检查是否已处理(如通过Redis的SETNX命令,原子判断是否已处理),实现幂等性消费。另外,利用Kafka事务特性,教师提交请假申请时,生产者开启事务,将请假申请消息写入“请假申请”主题,同时发送通知消息到“通知辅导员”主题,事务提交后确保两个操作原子性完成,即使其中一个主题操作失败,事务会回滚,避免数据不一致。这样,教师提交请假后,消息可靠传输到辅导员系统,且不会重复通知。
6) 【追问清单】
7) 【常见坑/雷区】