首先经常有人问,KAFKA有实现消息队列延迟消费的功能吗?
答案是否定的。但是,我们可以通过一些方法变通一下,也是可以实现延迟消费。
第一种:
如果你消费时间不是太复杂,甚至是固定的,那么你可以在producer端根据不同的延迟消费逻辑把不同的消息放到对应的topic里面,然后consumer就可以不顾producer端,直接根据不同的延迟逻辑去消费对应的topic。
第二种:
由于消息队列的作用从根本上为了解决并发消息的爆发引起的问题,所以利用KAFKA 进行有效的队列保存,那么我们就利用他这个机制,使用一个RDBMS(比如MYSQL)进行统一消费,然后客户再统一对RDBMS库进行条件扫描,比如每5秒扫描一次,获取对应的延迟消息进行消费处理。
当然如果你的架构确实需要这么一个有延迟队列的功能,那么建议使用其他MQ系统。比如RabbitMQ(参考:https://blog.youkuaiyun.com/dh554112075/article/details/90597649 )
关于rabbitMQ,他最简单的方法就是使用一个插件来实现(rabbitmq-delayed-message-exchange)https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
但是这个有一点要注意的地方,使用插件时发送到队列的消息数量在web管理界面不可见,但不影响正常功能使用。因为这个插件目前还是处于实验性阶段,虽然也能用于生产,但需要自己清楚他的使用范围是否合适你。
引用开发者的话:This plugin is considered to be experimental yet fairly stable and potential suitable for production use as long as the user is aware of its limitations.
意思是:这个插件被认为是实验性的,但相当稳定,只要用户意识到它的局限性,它就有潜力适合生产使用。