定时和延时问题在业务场景中的常见处理

JAVA葵花宝典

共 3475字,需浏览 7分钟

 ·

2020-08-12 23:17


本文将从如何处理业务流程和信息分发中的定时和延时问题出发,横向比较了业界常见的几种方案,如直接多线程编码、 Spring 定时调度框、大型分布式调度框架、消息中间件定时消息,因为消息中间件接口友好,调用方便,性能稳定,特别推荐了使用消息中间件来处理此类问题。同时对比了 ActiveMQ、RabbitMQ 和 RocketMQ 三种消息中间件在此类场景中的优劣势。

为了帮助大家理解消息中间件的使用,特别列举了三种常见场景及使用方案,同时列举了消息中间件 RocketMQ 定时消息的优势。近期定时消息特性会做大的更新,推出的新版定时消息已在阿里内部,稳定运行近两年,近期会发布到公有云上,敬请期待。



适用场景





在业务处理流程和信息分发过程中,定时\延时处理的需求可谓无处不在。如何优雅的满足想要在未来的某个时间点,处理预期事件、分发既定信息,满足对时间线的强诉求场景和业务逻辑的设计,常常也是我们经常会遇到的问题。笔者在横向对比过几个常用的技术方案之后,大概总结如下,分别都会有不同的优缺点:





直接多线程编码 Spring定时调度框 大型分布式调度框架 消息中间件定时消息
优点 较少

1、Spring集成环境,方便开发者集成。

2、接口、注解友好,方便开发者使用。

3、适合单机使用。

1、专用于分布式调度处理场景。

2、充分利用业务机器资源,处理调度任务

3、经历过大规模流量验证,高可用。

1、接口友好,方便开发使用。

2、支持“定时”和“延时”两种场景。

3、大型分布式场景,性能较好。

缺点

1、多线程编码,易出错。

2、重复造轮子,不符合开发原则。

3、程序较复杂,难以维护。

1、适合单机使用,分布式环境需要解决分布式锁问题。

2、适合定时场景,无法实现延时功能支持延时场景。

1、没有单独开源、售卖。

2、适合定时场景,无法实现延时功能支持延时场景。

无调度任务分片功能。



友好的接口设计、敏捷的开发模式,便于开发者快速高效地集成、研发。同时支持“定时”和“延时”两种场景,以高性能和高可用,支撑大规模的分布式业务场景。整体来看,消息中间件的使用更加便捷。

那么在不同的消息中间件之间,是否对这样的功能又有差别呢?首先让我们来看看一个优秀的定时\延时消息中间件,需要满足哪些特性?

1、轻量级,高性能,精确到秒级
2、支持高可用
3、足够的定时长度,比如可以支持到 30 天、 60 天等
4、支持取消定时消息,取消延时任务
5、支持绝对定时和相对定时
6、支持海量定时消息存储,高时效精度

综上,我们对业界几个常见的消息中间件做了简单对比:在现有的主流消息系统中, ActiveMQ、RabbitMQ 和 RocketMQ 都有提供定时消息的实现。但是ActiveMQ定时性能在 300TPS 左右,只适合小量场景。RabbitMQ 提供了一个定时插件,性能可达 2000TPS 左右,但不支持高可用,且不能堆积太多消息。

RocketMQ 融合了各大定时技术组件的优势,同时弥补了其他组件设计上的局限,研发出了 RocketMQ 新版定时消息,以适用支撑更多定时\延时场景。

是骡子是马拉出来溜溜。我们简单看下几个典型定时\延时场景,使用 RocketMQ 定时消息的实现方案。

场景一 :用户秒杀爆品,使用优惠券,创建订单就冻结了用户优惠券额度,对于下单失败的用户,需要超时自动解冻用户被冻结的优惠券额度。超时自动解冻机制,需要满足高精度、高可用、支持海量业务、支持超长延时。


场景二:外卖业务对时效性非常敏感,从用户下单起,便产生了“外送超时时间”,保障外卖业务的顺序进行。外卖超时机制,需要满足高精度、高可用、支持海量业务。


场景三:钉钉软件设置日程后,需要在日程时间达到时,自动提醒用户。钉钉日程提醒,需要满足高精度、支持超长延时。




概念介绍





那么让我们来熟悉下消息队列 RocketMQ 定时消息对于定时消息、延时消息的概念。在用户使用的视角和体验上,分为“定时性消息”和“延时性消息”两大类。



定时性消息:Producer 将消息发送到消息队列 RocketMQ 服务端,但并不期望这条消息立马投递,而是推迟到未来的某一个确定时间投递到 Consumer 进行消费。如上一节中“场景三”。

延时性消息:Producer 将消息发送到消息队列 RocketMQ 服务端,但并不期望这条消息立马投递,而是从当前时间延迟一定时段后才投递到 Consumer 进行消费。如上一节中“场景一”和“场景二”。

使用文档详见官网:
https://help.aliyun.com/document_detail/43349.html



RockeMQ 定时消息优势




高性能高可用

RocketMQ 的分级延迟消息,性能较高,可无限堆积,且满足高可用要求,支持精确到秒级的定时需求,且在海量存储的情况下,时效精度较高。

产品成熟度高

在阿里巴巴经济体的各大业务及大促场景中,RocketMQ 定时消息已经得到广泛运用,经历了无数流量洪峰和稳定性考验,积累沉淀出了业界先进稳定的定时消息系统。

技术社区活跃

RocketMQ 作为 Apache 顶级项目,已经建设完整的技术生态体系。支持多语言,多协议,定时消息天然继承了顶级项目的优点,具备完整的技术生态。

专业技术支持

阿里云专注云计算,RocketMQ 持续伴随阿里云技术架构进化升级。技术设施对外输出的同时,以强大的技术团队服务客户业务,为使用 RocketMQ 产品的客户,持续提供专业技术支持。



特别说明





本次新版定时消息功能进行了深度内核层架构优化,设计原理和功能实现上都做了较大的升级调整,从根本上进行了定时消息架构的变革,极大地提高了定时消息的稳定性和性能。



作者信息:


玄初,阿里云云原生应用中间件技术 MaaS 云消息产品技术研发,专注于中间件、微服务、Maas 领域。

推荐阅读:

代码优化实战:我又优化了一百个if else!
阿里内部员工,排查Java问题常用的工具单
优秀的 Java 项目,代码都是如何分层的?

点击阅读原文,领取2020Java电子书资料(持续更新

浏览 27
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报