
采用“前端轻量采集+Kafka解耦+Flink实时流处理+Redis缓存+WebSocket推送”的分层架构,通过消息队列隔离高并发压力、流处理保障低延迟、缓存加速响应,确保从数据采集到移动端展示的P99响应时间≤1秒,满足360安全SLA。
老师口吻解释各环节:
| 组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Kafka | 分布式消息队列 | 高吞吐、持久化存储、低延迟、高可用 | 实时数据流处理、日志收集、高并发解耦 | 需集群部署,管理复杂,适合高吞吐场景 |
| RabbitMQ | 企业级消息队列 | 可靠路由、灵活工作流、消息持久化 | 传统应用解耦、任务调度 | 延迟略高于Kafka,适合低延迟要求不高的场景 |
| Redis | 内存数据库 | 高速读写、缓存、会话存储 | 热数据缓存、实时查询 | 适合小数据量,需配置持久化(RDB/AOF)避免数据丢失 |
| Flink | 流处理引擎 | 实时计算、状态管理、容错 | 实时威胁检测、日志分析 | 需集群资源,适合复杂流处理逻辑 |
伪代码展示数据流:
// 移动端发送数据到Kafka(示例请求)
POST /api/threat/submit
{
"device_id": "device_123",
"timestamp": 1672500000,
"data": "network_request: http://malicious.com"
}
// Flink作业处理逻辑(简化)
DataStream<ThreatEvent> stream = env.fromKafka("threat_topic", ...);
stream
.map(event -> new ThreatEvent(event.getData().split(":")[1], event.getTimestamp()))
.keyBy(ThreatEvent::getUrl)
.process(new WindowedFunction<ThreatEvent, ThreatScore>() {
@Override
public ThreatScore process(
KeyedProcessFunction<String, ThreatEvent, ThreatScore> ctx,
ThreatEvent input,
Context ctx1,
Collector<ThreatScore> out) {
return new ThreatScore(input.getUrl(), checkBlacklist(input.getUrl()), input.getTimestamp());
}
})
.addSink(new RedisSink("threat_cache", ThreatScore::toRedisValue));
// 移动端从Redis查询(示例请求)
GET /api/threat/check?url=http://example.com
// 响应:{"status": "malicious", "score": 0.95, "timestamp": 1672500010}
“面试官您好,针对高并发实时威胁检测,我设计的架构是分层解耦的。前端通过轻量SDK采集数据,通过Kafka消息队列解耦,确保高并发下数据不丢失。后端用Flink做实时流处理,快速匹配威胁特征,结果写入Redis缓存。移动端通过WebSocket从Redis获取结果,展示给用户。这样整个链路响应时间控制在1秒内,满足360的SLA。具体来说,前端采集数据推送到Kafka,后端Flink处理并缓存到Redis,移动端直接从Redis读取,避免二次计算,保证低延迟。”