面试题答案
一键面试1. 使用死信队列(DLX)结合 TTL(Time To Live)实现
- 原理:在 RabbitMQ 中,为队列设置 TTL(消息存活时间),当消息在队列中存活超过 TTL 设定的时间,会被发送到死信队列(DLX)。生产者将需要延时处理的消息发送到设置了 TTL 和 DLX 的队列,消费者从死信队列中消费消息,从而实现延时效果。例如,一个订单支付消息,设置 TTL 为 10 分钟,若 10 分钟内未支付成功,消息进入死信队列,被处理订单超时逻辑的消费者消费。
2. 利用 Kafka Streams 或自定义 Kafka 消费者实现
- 原理:
- Kafka Streams:通过 Kafka Streams 的时间窗口操作,在处理流数据时,可以按照时间窗口来处理消息。例如,设定一个 5 分钟的窗口,消息进入窗口后等待 5 分钟,窗口关闭时触发处理逻辑,从而达到延时处理的目的。
- 自定义 Kafka 消费者:消费者拉取消息后,根据消息中的时间戳等信息判断是否达到处理时间。如果未达到,将消息暂存(如存到内存队列、数据库等),定期轮询检查,当达到处理时间时进行处理。比如,消息中携带预计处理时间字段,消费者获取消息后,对比当前时间与预计处理时间,不符合则等待。
3. 基于 Redis 的有序集合(Sorted Set)实现
- 原理:Redis 的有序集合可以存储带有分值(score)的成员(member)。将延时消息作为成员,以消息期望处理的时间戳作为分值。生产者将消息及对应处理时间插入有序集合。消费者定时从有序集合中获取分值小于等于当前时间的消息进行处理。例如,有一条延时 30 分钟的消息,将其加入有序集合,分值为当前时间加上 30 分钟对应的时间戳,消费者定时扫描集合,处理满足条件的消息。