最近在看Kafka延迟队列的实现方式,发现大部分讲的都很片面,都是时间轮相关的东西,搞得一知半解的,最终根据自己的理解,设计了一套延迟队列,和大家一起讨论一下,服务流程如下

如图所示,所有的消息进来之后,都会被分配到delay队列中,然后delay队列消费消息满足时间要求后再发送到业务队列中,这样做的目的是避免消息阻塞,如果我们没有delay队列,所有消息都在业务队列中,那必然会产生一定的堆积,因为这个队列本身要做的事情太多,delay队列就是为了分担他的压力

这里说下为什么有三个delay队列,我这里其实是想根据业务划分优先级,也是为了可以减少消息的延迟,将数据做了归类,比如延迟1分钟左右的数据,放在高优先级的队列中, 10分钟延迟的放在中优先级,2小时延迟的放在低优先级

具体的操作方式:每个delay队列中的消息,不仅要存当前消息的内容,还要存下一个要消费的消息位置(offet),这样就可以避免我们以 O(n)的复杂度去遍历队列,检查要执行的队列数据,另外考虑到有新增数据插队的情况,需要在缓存中也维护一份当前最优先的offet值,方便我们做插队处理

kafka中可以修改offet值,通过seek() 函数即可

这里还要考虑一个问题,就是当最优先的队列数据还有1小时才要执行,那我们怎么处理,是sleep吗?如果sleep太久的话,当程序代码不能在max.poll.interval.ms配置的期望时间内处理这些消息的话,kafka就会认为这个消费者已经挂了,会进行rebalance,同时你这个消费者就无法再拉取到任何消息了,Kafka本身提供很优雅的解决方案,pause() 方法可以暂定消费,resume() 方法可以恢复消费,这样就不会出现异常了

kafka 延迟队列相关推荐

  1. 别再说你不会!kafka延迟队列

    Java基础 1.JAVA 中的几种数据类型是什么,各自占用多少字节. 2.String 类能被继承吗,为什么. 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true ...

  2. 如何用 Redis 实现延迟队列?

    如何用 Redis 实现延迟队列? - 前言 - 我们都知道Redis是一种基于内存的单进程单线程数据库(Redis6.0开始之后支持多线程啦! ),处理速度都非常快. 那么为何Redis又能慢呢? ...

  3. 高可用延迟队列设计与实现

    延迟队列:一种带有 延迟功能 的消息队列 延时 → 未来一个不确定的时间 mq → 消费行为具有顺序性 这样解释,整个设计就清楚了.你的目的是 延时,承载容器是 mq. 背景 列举一下我日常业务中可能 ...

  4. 【RabbitMQ】一文带你搞定RabbitMQ延迟队列

    本文口味:鱼香肉丝   预计阅读:10分钟 0|1一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经 ...

  5. RabbitMQ如何实现延迟队列?

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. 你真的知道怎么实现一个延迟队列吗 ?

    作者:xiewang,腾讯 IEG 运营开发工程师 前言 延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案.前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因 ...

  7. redis延迟队列 实现_php使用redis的有序集合zset实现延迟队列

    延迟队列就是个带延迟功能的消息队列,相对于普通队列,它可以在指定时间消费掉消息. 延迟队列的应用场景: 1.新用户注册,10分钟后发送邮件或站内信. 2.用户下单后,30分钟未支付,订单自动作废. 我 ...

  8. 【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列

    [重难点][RabbitMQ 01]消息队列的作用.主流的消息队列.RabbitMQ 基于什么传输消息.RabbitMQ 模型架构.死信队列和延迟队列 文章目录 [重难点][RabbitMQ 01]消 ...

  9. java延迟队列,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. Java学习day010(oop):向上造型
  2. 非此即彼的逻辑错误_MBA逻辑攻略-逻辑知识大全,快来收藏吧!
  3. Android屏幕方向调整的两种方式
  4. 第五章:Java_面向对象编程(三)
  5. 聊聊gcc参数中的-I, -L和-l
  6. 前端学习(1164):剩余参数02
  7. 业务赋能利器之外卖特征档案
  8. mysql root用户可以同时几个人连接_PHP安全:MySQL的使用安全
  9. java面向服务架构_面向服务的体系架构 SOA(一) --- 基于TCP、HTTP协议的RPC
  10. SPAW Editor .NET Edition v.2乱用:使用代码调整编辑器高度
  11. 本田2022年新车将搭载谷歌Automotive OS
  12. 完美解决Python套接字编程时TCP断包与粘包问题
  13. Reading Excel with Python
  14. WMI 查询分析工具更新
  15. kettle 数据库密码解密
  16. 140个电脑小知识、小技巧(2)
  17. 手把手教你写一个web聊天室之bookstap框架
  18. NSX-T业务转发04—— 多层Tier0Tier1路由
  19. 天宇优配|“宁组合”全线大跌,“蔚小理”也重挫!医药
  20. 〖Python 数据库开发实战 - Python与MySQL交互篇④〗- 数据库连接池技术

热门文章

  1. 从libc-2.27.so[7ff3735fd000+1e7000]崩溃回溯程序段错误segfault
  2. c语言总统竞选问题,一上台就紧张?这个模型生成演讲替身,肢体语言比总统候选人还丰富...
  3. 虚拟机-问题-Ubuntu安装VMware Tools
  4. 2019年天梯赛-全国总决赛-L2-032 彩虹瓶 (25 分)
  5. 人到中年才懂10个“潜”规则,过来人:除了生死,其他都是闲事
  6. 【正点原子Linux连载】第十八章 Camera 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2
  7. 百度开放平台(文本转化音频)
  8. 机房服务器系统监控软件,机房服务器系统监控软件
  9. 03-元素定位-基本
  10. 周志华西瓜书学习笔记(一)