
1) 【一句话结论】采用WebSocket长连接 + 消息队列(如Kafka) + iOS原生推送(APNs)的混合方案,通过WebSocket处理在线低延迟消息,APNs处理离线场景,消息队列解耦保证可靠性,实现低延迟与高可靠性。
2) 【原理/概念讲解】老师口吻解释关键概念:
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| WebSocket | 基于HTTP的持久化双向通信协议 | 全双工、低延迟、单连接多消息 | 在线实时消息(如通知、聊天) | 需客户端支持,连接断开需重连 |
| APNs | 苹果设备推送服务,需设备Token | 离线支持、消息暂存、设备Token管理 | 离线或网络断开场景 | 需维护设备Token,Token过期需重新注册 |
| 消息队列(如Kafka) | 面向消息的中间件 | 异步、可靠、高吞吐、持久化 | 解耦生产者与消费者,保证消息不丢失 | 需考虑延迟(Kafka延迟低,RabbitMQ低延迟但吞吐稍低) |
4) 【示例】
// WebSocket连接
let ws = URLSession.shared.webSocketTask(urlRequest: URL(string: "wss://api.haofutui.com/ws")!, completionHandler: { [weak self] task in
task.onText = { text in
// 解析消息,显示通知
}
task.onClose = { [weak self] code, reason in
// 连接断开,指数退避重连
}
task.onError = { error in
// 错误处理
}
})
ws.resume()
// 订阅主题
ws.send("subscribe,topic:homework")
// 注册APNs
let apns = APNS()
apns.deviceToken = deviceToken // 获取设备Token
apns.registerForPushNotifications()
# Kafka生产者
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=['kafka:9092'], value_serializer=lambda v: json.dumps(v).encode('utf-8'))
producer.send('homework_notifications', value={'type': 'notification', 'message': '新作业发布'})
# 推送服务(消费Kafka并推送到WebSocket和APNs)
from kafka import KafkaConsumer
consumer = KafkaConsumer('homework_notifications', bootstrap_servers=['kafka:9092'])
for msg in consumer:
notification = msg.value.decode('utf-8')
# 推送至WebSocket
push_to_websockets(notification)
# 推送至APNs(离线队列)
push_to_apns_offline(notification)
5) 【面试口播版答案】
“面试官您好,针对实时消息推送的低延迟和高可靠性需求,我的设计是采用WebSocket长连接 + 消息队列(如Kafka) + iOS原生推送(APNs)的混合方案。具体来说,前端建立WebSocket连接后订阅特定主题(如作业提醒),后端将消息写入消息队列,推送服务从队列拉取并推送给所有活跃连接,实现在线时的低延迟;同时,前端获取设备Token注册APNs,后端将消息也推送到APNs的离线队列,确保用户断网后重新联网也能收到消息,保证离线场景的可靠性。这样既通过WebSocket保证了实时性,又通过APNs和消息队列保证了高可靠性。”
6) 【追问清单】
7) 【常见坑/雷区】