指定时间触发业务功能实现思考

本贴最后更新于 2987 天前,其中的信息可能已经时移俗易

需求

需要根据客户指定时间触发业务

  • 指定时间触发、指定时间结束,比如 12:01:09:13:13:29:30
  • 用户可以随时修改时间
  • 触发时间误差越小越好
  • 业务量会不断增长

我当前的设计思路:

  • 执行数据库操作 Job,定时查询快要生效或者失效的数据到 Redis list 结构中
  • 执行 Redis 操作 Job 处理生效数据,定时查询当前内存快要生效数据,发现生效则进行事件触发,加入线程池中进行操作
  • 执行 Redis 操作 Job 处理失效数据,定时查询当前内存快要失效数据,发现失效则进行事件触发,加入线程池中进行操作
  • 每个 Job 的时间可以根据业务量进行调整,比如数据库半小时拉取一次半小时内会生效数据加载到 Redis,Redis 每 2 分钟遍历数据判断当前是否生效操作
  • Redis 数据结构为 List,用户修改时间时后如果不再在时间范围内则进行删除,如果在则先删除再插入

大概的流程图

数据库查询执行 Job

A15D9397-2184-454B-85B3-E4E30788D67F.png

Reids 生效执行 Job

299C3AA3-8496-45AB-AD21-99DD8A26FEAA.png

我的疑问

  • 使用 Redis list 数据结构是否合理,是否需要排序用 zset(集群下 zset 效率是否有问题)
  • 业务量不断增大时需要对 Redis list 进行分区处理(多个 list 多台机器消费),怎样做到自动扩展
  • 目前还没有进行具体的操作的时间估算,还不确定基于当前的方案最大可以处理的业务量和时间误差可以做到什么程度?当前方案的瓶颈和风险还有哪些?

对于当前方案我思考的还比较粗糙,大家对这个方案有什么疑问?有什么更好的想法

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 61 关注
  • 计划任务
    1 引用 • 8 回帖
  • 方案设计
    1 引用 • 8 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • vanlin

    根据我与朋友讨论的结果可以使用下面的办法
    ##消息队列的延迟消息,精度在 30 秒内

    具体做法,就是使用比如 RocketMQ 这类支持延迟消费的消息队列,配置不同延迟级别,按时消费,配合业务数据来决定是否到达消费时间

    ##etcd 的过期回调,这个更精确楼主可以自行研究一下

    2 回复
  • jiangzezhou
    作者

    好的,之前也考虑过队列,当时感觉稍复杂,今天再认真思考下。

  • jiangzezhou
    作者

    使用 RocketMQ 但用户修改了怎么处理?消费的时候判断时间是否更改?

    2 回复
  • yangyujiao

    之前我们给日本做一个东西就是需要启动很多的定时器来完成不同的命令。

    但是我们那会只是查询数据库中的消息,统一设定一个总的程序去遍历这些消息,然后根据消息中自带的一个时间来启动不同的 job 实现多个定时器的功能。

    我们技术太 low,当时也没有考虑数据量大的问题,不过貌似她们的命令也不会太多的。后期那个项目啥情况的,我也不知道,交接给别的组了,刚好后来我就离职了。根据我们公司的技术水平,那个组做那个项目会很吃力的。

    1 回复
  • jiangzezhou
    作者

    如果每个记录都产生一个定时任务的话感觉不可控,处理上限有限。

    1 回复
  • yangyujiao

    她们那个会 提前把命令等基础表做好 命令就那些 要求是按照数据库中每个命令的时间开始的

  • pianopaper

    java 不是有定时器嘛?

  • vanlin

    修改了没关系啊,之前的消费运行的时候要去看相应业务数据,,它就不做事了呗,,另外在修改后又发出一个新的定时消息出来即可啊。

请输入回帖内容 ...