1) 【一句话结论】采用分层架构(数据采集层、实时处理层、规则决策层、结果输出层),以Kafka(本地模式)作为数据缓冲,Flink实现流式计算,结合Redis+MySQL双写保证一致性,通过负载均衡和集群部署实现高可用,核心目标是毫秒级低延迟与99.99%以上高可用。
2) 【原理/概念讲解】老师可以解释,实时风控系统需兼顾“快”与“稳”。数据采集层用Kafka(本地模式)减少网络延迟,接收交易数据;实时处理层用Flink,支持状态管理(检查点)保证容错;规则引擎(Drools)匹配规则,规则热更新通过Kafka发布变更消息,Flink实时消费更新状态;结果输出层Redis缓存实时告警,MySQL存储历史数据。网络延迟优化用Kafka本地模式,减少数据采集层传输开销;数据一致性双写时,Redis设置TTL,若MySQL写入失败,重试或回滚,确保最终一致。
3) 【对比与适用场景】
- 消息队列对比:
| 组件 | Kafka | RabbitMQ |
| --- | --- | --- |
| 定义 | 分布式消息队列,高吞吐、持久化 | 企业级消息队列,支持多种协议 |
| 特性 | 高吞吐(百万级)、持久化、多分区 | 队列模型(普通/死信)、支持事务 |
| 使用场景 | 实时交易流(如反洗钱数据)、大规模数据 | 企业内部系统解耦、需事务场景 |
| 注意点 | 需手动管理分区、消费组 | 部署复杂、性能不如Kafka |
- 流处理引擎对比:
| 组件 | Flink | Spark Streaming |
| --- | --- | --- |
| 定义 | 流式计算框架,支持状态管理、事件时间 | Spark流式计算组件 |
| 特性 | 状态管理(检查点)、事件时间处理、低延迟 | 窗口计算、批流结合 |
| 使用场景 | 实时风控(低延迟、状态恢复)、实时分析 | 大数据实时处理、批处理 |
| 注意点 | 学习曲线、状态管理配置 | 窗口大小调整、延迟 |
4) 【示例】
- 规则热更新流程:规则管理模块将规则变更消息(JSON格式,含rule_id、新规则内容)发布到Kafka主题“rule-updates”。Flink作业消费该主题,解析消息后更新本地规则状态(如内存中的规则表),并触发规则引擎重新加载新规则。
- 数据采集层:交易系统将交易数据发送到Kafka(本地模式,减少网络延迟),Flink消费后进行清洗,调用Drools匹配规则,匹配成功则将告警写入Redis(TTL=60秒)和MySQL(主从复制)。
- 双写机制:Flink将数据写入Redis和MySQL,Redis设置TTL=30秒,若MySQL写入失败,Flink重试3次,失败则记录日志并补偿。
5) 【面试口播版答案】
面试官您好,针对实时风控系统,我设计的架构分为四层:数据采集、实时处理、规则决策、结果输出。数据采集层用Kafka(本地模式)接收交易数据,减少网络延迟;实时处理层用Flink,支持状态管理保证容错;规则决策层用Drools,规则热更新通过Kafka发布变更消息,Flink实时消费更新状态;结果输出层Redis缓存实时告警,MySQL存储历史数据。为保证低延迟,规则轻量化、Redis缓存预热、Flink并行处理;高可用通过Nginx负载均衡多实例、数据库主从复制、Kafka多副本。这样系统既能快速响应交易,又能稳定运行。
6) 【追问清单】
- 问:规则热更新时如何保证Flink作业实时更新规则状态?
回答要点:通过Kafka发布规则变更消息,Flink作业消费后更新本地规则状态(如内存表),无需重启作业。
- 问:数据一致性如何处理Redis和MySQL双写冲突?
回答要点:Redis设置TTL,若MySQL写入失败,重试3次,失败则补偿。
- 问:如何优化Flink的延迟?
回答要点:规则缓存预热、并行计算(多线程消费)、调整窗口大小(高频交易用小窗口)。
7) 【常见坑/雷区】
- 规则热更新未设计具体流程,导致系统重启后规则失效。
- 忽略数据采集层网络延迟,使用普通Kafka模式导致延迟增加。
- 双写机制未考虑冲突处理,导致脏数据。
- 高可用未部署多节点集群,单点故障风险高。