定时给达到条件的用户发送短信问题

2019-01-13 15:55:47 +08:00
 334862132
以前接到一个需求,定时给注册一半的用户发送短信,我设计的实现方法是先把用户在 redis 中缓存,之后设置一个过期时间,然后每半小时检索一次对达成条件的用户进行短信发送,然后最近随手点开一个 app,人家的短信推送竟然能精确到分钟,我如果也把 redis 缓存做成分钟缓存,每一分钟执行一次感觉对服务器压力很大,如果不是用定时任务一分钟检索一次去发送短信的话还有哪种方法能达到优化的效果?
求大神指点~!
2900 次点击
所在节点    Python
16 条回复
jiangnanyanyu
2019-01-13 16:05:35 +08:00
要搞成那种 reactive 模式的
qile1
2019-01-13 16:15:39 +08:00
用数据库的触发器可以做到实时发送
334862132
2019-01-13 16:25:41 +08:00
@qile1
@jiangnanyanyu
谢谢,等我研究一下这俩种方法
tomczhen
2019-01-13 16:27:25 +08:00
触发一个延迟任务,任务检查用户操作进度,根据条件执行业务逻辑。
ankle306
2019-01-13 17:34:03 +08:00
mq,延迟消息
KasuganoSoras
2019-01-13 18:32:46 +08:00
用 php 写一个小脚本就可以
写了一个简单的例子给你: https://github.com/kasuganosoras/SomeCodes/blob/master/v2ex_526598.php
具体的你自己改一下就可以了
xiangyuecn
2019-01-13 18:47:03 +08:00
对服务器压力很大 亮了
也许 99.9% 的定时任务回调对服务器一点影响没有也说不一定呢

如果你的每天注册的用户是海量的。。会发现这是矛盾的。。因为那时候,可能并不会用一个任务通过一次来处理所有的数据

先让任务使劲搞,后面如果服务器确实因为这个任务产生了影响,那就再想办法呗,干嘛提前优化?
richzhu
2019-01-13 19:07:45 +08:00
有要求一分钟之内全发完吗? 弄个队列,让它慢慢发去不就好了,除非你的用户真的是很多…… 那样的话就不要想着用一个计划任务,或者一次处理就弄好呢
jimrok
2019-01-13 20:54:22 +08:00
1 分钟对 redis 不会有太大的影响,一分钟做个一个 set。正经的途径是做个时间轮。
334862132
2019-01-14 08:22:28 +08:00
@KasuganoSoras 我是写 python 的,我自己的脚本把 1 小时改成 1 分钟就可以了,不过仍然谢谢
334862132
2019-01-14 08:26:31 +08:00
@xiangyuecn @richzhu 嗯 可能是我杞人忧天吧, 我很不要脸的表示 除了定时任务脚本我写的 发短信都不是我写的, 那短信接口用 TM 同步,都神逻辑,因此我怕对服务器压力大,我不过顺口提了一嘴,人家不改我也没办法,另外说一下 我们用的是 django,要是用 tornado 用同步我就忍了......
334862132
2019-01-14 08:27:56 +08:00
@tomczhen 延时任务总是查单个用户,感觉还不如一分钟查一下把符合条件的都拽出来呢,查询的次数更少,性价比更高呢
334862132
2019-01-14 08:29:41 +08:00
@jimrok 谢了 时间轮是个不错的想法
ShangAliyun
2019-01-14 10:31:36 +08:00
这种一般是定时执行的,比如每天早上 10 点
Raymon111111
2019-01-14 11:48:57 +08:00
让 key 的维度是分钟粒度的, 然后每分钟去轮询.

压力不会大的, 相信我.
tomczhen
2019-01-14 12:37:37 +08:00
@334862132 数据库锁的粒度不同。

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

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

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

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

© 2021 V2EX