现在是有个车辆信息表,表里有年检到期日期 inspection_date 和保险到期日期 insurance_date 字段,现在的需求是对这些时间进行监控剩余 15 天有效期进行消息提醒,推送通知给驾驶人员。想问下这场景应该怎么做?感谢
1
lsk569937453 2023-07-28 10:48:31 +08:00
每天定时任务扫描一下呗。
|
2
buchikoma 2023-07-28 10:58:09 +08:00
起一个永驻的后台进程,在设置 inspection_date 和 insurance_date 的时候,分别计算 Duration (多久秒之后到期),去后台进程注册这个任务并在 Duration 时间之后发送一条 message 给前台进程做推送,Duration 可以理解为一个 timeout
|
3
v2eb 2023-07-28 11:17:48 +08:00
Timer 就好了, 项目启动时候扫一下当天的, 定时任务每天扫, 扫出来用 Timer 处理
|
4
simonlu9 2023-07-28 11:22:07 +08:00
redis 延时队列
|
5
me1onsoda 2023-07-28 11:23:29 +08:00
延迟队列
|
7
brader 2023-07-28 11:25:34 +08:00
|
8
xwayway 2023-07-28 11:25:52 +08:00 10
这不就是一个定时任务,每天扫一遍就行了的事么。延迟队列瞎 JB 扯淡,为了用中间件而用。
|
11
buchikoma 2023-07-28 11:32:07 +08:00
@Allenxup #6 没用过 java ,但比较简单且通用的就是起一个 Supervisor 去监控进程,或者用 actor 这种模型
|
12
brader 2023-07-28 11:33:50 +08:00
@Allenxup 我以前做过类似的需求,通知表字段就记录一些标识、内容、通知时间之类的,每天在白天多少点发通知。我们做白天的话,一是不会打扰用户,二是我们接入的是厂商通知栏推送,有些厂商晚上是不允许你推送的
|
13
blackmirror 2023-07-28 11:35:45 +08:00
这不最简单的功能了,定时跑不就完了,还真要造火箭 啊
|
14
luomao 2023-07-28 11:37:28 +08:00
|
15
sujin190 2023-07-28 11:38:14 +08:00 via Android
长时任务不要用暂时对接和计时器,否则就是个大坑,最靠谱最简单的还是每天执行个任务查询下满足条件的执行就好了
|
16
mdn 2023-07-28 11:40:01 +08:00
每天 9 点定时检测,>=15 && < 16 的发送短信
|
17
nkidgm 2023-07-28 11:55:20 +08:00
无必要放队列啊,每天定期扫表的时间字段,发现时间差在规定范围内,就触发通知程序。
新车年检有效期一般是 2 年,你不会提前 2 年就把年检的通知消息放到消息里面吧,你得保证 2 年期间这个消息不会丢失才行,还有队列被撑爆得情况。 |
18
Ericcccccccc 2023-07-28 11:56:09 +08:00 1
记住一点, 任何定期触发的功能靠的都是轮询.
|
19
nkidgm 2023-07-28 11:57:25 +08:00
最简单用 spring task 去执行 SQL 就行了。
|
20
mmdsun 2023-07-28 11:58:47 +08:00
每天跑,SQL 查 监控剩余 ∈[15, 16 ]天 , 查出来处理通知就可以了。
数据量大可以用那种支持 mapreduce 分片的任务框架,比如 PowerJob 框架,这个作者也在 v 站。 |
21
kanepan19 2023-07-28 12:24:39 +08:00
这种需求要什么延迟队列, 又不是订单超时, 直接扫库就好了。
那啥啥某电商不就直接扫库的吗? |
22
simbaCheng 2023-07-28 14:28:45 +08:00
时间轮
|
23
a62527776a 2023-07-28 14:32:21 +08:00
时间轮不是非常成熟吗?
|
24
ZhiyuanLin 2023-07-28 14:48:20 +08:00
今年刚做过几亿用户类似需求的项目,也是写个 Spring Batch 每天去扫数据库的。没必要用多复杂的架构。
|
25
senjyougahara 2023-07-28 14:55:07 +08:00
可以一周或半周跑一次轮询,然后逐个通知
|
26
vagusss 2023-07-28 15:32:42 +08:00
定时扫库就行, 简单有效
|
27
wqhui 2023-07-28 16:06:49 +08:00
每天扫一下表不就行了吗,怕数据量太大,用 SQL 把筛选出来的数据扔个临时表,应用分批取出来发通知
数据更新导致发错其实不要紧,通知类的东西不太重要。比如 8 点扫表这个人到期了,但 10 点才发出通知,这个人 9 点跑去更新了到期时间,照样给他发也没事又不会导致什么记录被覆盖 |
28
simonlu9 2023-07-28 16:29:15 +08:00
@Allenxup 很简单,删掉就可以了,参考 redission 实现,没必要把时间久远的放 redis,用 xxl 每天扫描一遍是不是快到 24 小时结束了,如果是旧放到 redission
|
29
la2la 2023-07-28 17:41:24 +08:00
定时任务每天扫一遍就行呗
|
30
hevi 2023-07-28 18:00:54 +08:00
虚心请教定时任务的逻辑:
发送前是否还要查一次有没已经发过?如果定时器还没扫之前,程序崩了 |
31
huzhizhao 2023-07-28 23:15:53 +08:00 via iPhone
定时器扫不就完了。
|
32
xuanbg 2023-07-29 06:37:16 +08:00
定时器每天凌晨扫一次表,符合条件的发通知就完了。写代码,最简单有效的笨方法才是最好的。
|