消息队列|Kafka支持延迟消息
Fang 2024/12/21 后端消息队列
# Kafka支持延迟消息
# 延迟队列和延迟消息
# 延迟队列
延迟队列是一种特殊的队列
它里面的每个元素都有一个过期时间,当元素还没到过期时间的时候,如果你试图从队列里面获取一个元素,你会被阻塞
当有元素过期的时候,你就会拿到这个过期的元素
可以这样想,拿到的永远是最先过期的那个元素
# 延迟消息
基于消息队列的延迟队列,也叫做延迟消息
具体来说,延迟消息是指消息不是立刻被消费的,而是在经过一段时间之后,才会被消费
在到时间之前,这个消息一直都被存储在消息队列的服务器上
订单超时取消的例子,它就用到了延迟消息
# 支持延迟消息的其他消息队列
RabbitMQ有插件支持延迟消息功能,而RocketMQ和Kafka则只能自己开发
# RabbitMQ延迟消息
rabbitmq_delayed_message_exchange
启用这个插件就可以使用延迟消息
这个插件的基本原理也比较简单,就是实现了一个exchange。这个exchange制住了消息什么时候会被真的投递到队列里
消息暂存exchange里,使用Mnesia来存储当延迟的时间满足条件之后,存储的消息会投递到真正的消息队列
启发:
- 实现一个延迟队列可以借助数据库
限制:
- 消息在投递到目标消息队列之前,存放在服务端本地的Mnesia,如果这时候没有刷新磁盘或节点不可用,消息可能丢失
- 不支持高并发、大数据量,现实中很多场景都是要在高并发大数据量场景下使用延迟消息
除此之外,可手动实现延迟消息