app 的推送系统(阿里云推送)怎么设计

2018-12-16 11:39:08 +08:00
 uoddsa
公司现在的系统是一个推送的消息表,用户的消息记录表(用户个人中心要看到记录)。
每次添加广播(全体推送)的时候,在消息表添加一条记录,然后在用户的消息记录表添加上了所有用户的记录...
定时任务的间隔都是一分钟,一次拿取所有未推送的记录然后推送出去。然后这里就有一个 bug,前一分钟拿到的所有记录未推送完,也就是推送的状态未修改完,下次推送的定时任务有进行,就会造成重复推送了。
各位大佬你们的这个相关的是怎么设计的。
4677 次点击
所在节点    PHP
20 条回复
Kinnice
2018-12-16 12:32:52 +08:00
redis
rockyou12
2018-12-16 12:38:30 +08:00
消息生产者吧未推送的消息放进队列里,用 redis、或者 kafka、rabbitmq 这些都行。发送者订阅队列然后发送,不要用定时任务循环查表表。
uoddsa
2018-12-16 16:35:09 +08:00
@rockyou12 谢谢,查过相关的内容,但是不定时的话,什么时候可以触发消费者进行消费呢。
lifespy
2018-12-16 16:56:18 +08:00
分组推送,不要一次全部推送
lihongjie0209
2018-12-16 16:59:26 +08:00
这是一个并发定时任务的问题, 把定时任务设置为禁止并发执行就可以, 或者是有一个全局锁保证只有一个定时任务在运行
opengps
2018-12-16 17:05:56 +08:00
消息队列,取过的数据在就读取不到了
rockyou12
2018-12-16 17:09:13 +08:00
@uoddsa 发布订阅机制,生产者发布了消费者会马上知道,如果消费者消费速度慢了,消息就堆积在队列上
CallMeReznov
2018-12-16 17:10:55 +08:00
rabbitmq
loveCoding
2018-12-16 17:23:59 +08:00
存个任务状态标识就行了,用户量不多,不要搞那么复杂.
MQ 作为消费者一直会有 listener 监听 topic 消息并消费,不需要干预
wd
2018-12-16 17:49:08 +08:00
简单处理的话,每条消息加一个标记呗,表示未推送,正在推送,已经推送
wd
2018-12-16 17:50:19 +08:00
或者就是启动任务的时候,检查下钱一个任务是不是完了。
wuYin
2018-12-16 17:56:50 +08:00
以前用 curl_multi 硬核实现过类似推送 [允悲]
myhot21
2018-12-16 17:59:10 +08:00
这需求和消息队列完全一样。
agdhole
2018-12-16 18:12:55 +08:00
量小的话简单的消息队列就行,php 也有很多这方面的轮子
hcheng
2018-12-16 22:09:43 +08:00
我们用了 flock 这个命令,老哥可以去了解下
alcarl
2018-12-16 22:34:24 +08:00
。。。。。。。。定时任务 select 扫出来,扔到推送之前加个推送中的状态和发起推送时间就可以了,再加一个定时任务处理发起推送时间超过 10 分钟状态仍然没变成已推送的,重新改发起推送时间,重新推,还可以加个推送次数,判断推几次就不推了。。。。。。别问我怎么知道的(T _ T)
uoddsa
2018-12-17 10:01:46 +08:00
@rockyou12 好的,谢谢老哥。
uoddsa
2018-12-17 10:02:46 +08:00
@wd 现在已经有状态这个字段了,只不过是边推边改,后续的定时任务来了就拿到了上次未修改的记录了。
uoddsa
2018-12-17 10:03:29 +08:00
@hcheng
@agdhole
@loveCoding
@CallMeReznov
谢谢各位老哥,我参考一下~
junbaor
2018-12-17 16:27:08 +08:00
如果是全体用户推的话那就不用这么浪费空间给每个用户存一行,我们是单独有一个全局消息表,用户拉自己消息的同时也会拉取全局消息,合并后返回给客户端。全局消息还有类似 tag 一样的东西和用户 tag 进行匹配。

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

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

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

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

© 2021 V2EX