基于 Java 通知类的功能模块设计

2021-02-10 23:39:59 +08:00
 samin

背景

根据设置会给用户生成一系列任务,有任务开始时间任务结束时间,在这段时间内执行完成,才算是正常完成任务,否则逾期。

需求

后台管理界面设置在任务结束时间前 N 分钟向用户发起提醒推送。

实际用例

前提

  1. A 用户被下达了一个 9:00 ~ 10:00 的任务
  2. 后台设置了 10 分钟的提醒功能

结果

A 用户在 9:50 会收到一条任务即将结束的通知

痛点

寻求目前业界常用的做法是啥 ? 没有做过这类功能的开发。

我目前的解决思路

方案一

服务器端做轮询操作,每隔一段时间去扫描所有的任务,符合条件的通过极光推送至客户端,通过 Wobsocket 通知 Browser 后台管理端。

方案二

服务端做定时任务,每个任务生成的时候,自动生成一个距离结束前 N 分钟的定时任务,到时间了自动触发,通过极光推送至客户端,通过 Wobsocket 通知 Browser 后台管理端。

方案三(只能适配客户端)

服务端向手机 APP 端下发提醒参数,APP 端拉取用户所有进行中的任务,APP 端监听任务进行任务提醒功能。

总结

个人比较偏向方案三,只做客户端的提醒功能,后台管理其实不需要知道这个提醒,只需要关注结果,可以消耗更少的服务器资源实现这个需求。

2055 次点击
所在节点    Java
6 条回复
choice4
2021-02-10 23:55:25 +08:00
直接延时队列有什么问题吗
icql
2021-02-10 23:56:55 +08:00
这不是延时消息 /队列干的事儿嘛,生成任务时发个延时消息就好了
luozic
2021-02-11 00:03:59 +08:00
actor 模型,非常合适这种消息
mmdsun
2021-02-11 00:32:09 +08:00
"
A 用户被下达了一个 9:00 ~ 10:00 的任务
后台设置了 10 分钟的提醒功能
结果

A 用户在 9:50 会收到一条任务即将结束的通知"

你这个就是指定时间触发一个通知操作,用任务调度框架也能实现。
wangyanrui
2021-02-11 00:36:13 +08:00
小项目直接用 redis 的 zset,大点的上个延时队列,客户端轮训即可,尽量不要客户端实现全部逻辑,否则后期想改动逻辑的话比较困难
samin
2021-02-12 22:52:57 +08:00
综合想了一下,直接采用 CRON 工程做掉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752882

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX