app 的推送系统(阿里云推送)怎么设计 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
uoddsa
V2EX    PHP

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

  •  
  •   uoddsa 2018-12-16 11:39:08 +08:00 5060 次点击
    这是一个创建于 2540 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司现在的系统是一个推送的消息表,用户的消息记录表(用户个人中心要看到记录)。
    每次添加广播(全体推送)的时候,在消息表添加一条记录,然后在用户的消息记录表添加上了所有用户的记录...
    定时任务的间隔都是一分钟,一次拿取所有未推送的记录然后推送出去。然后这里就有一个 bug,前一分钟拿到的所有记录未推送完,也就是推送的状态未修改完,下次推送的定时任务有进行,就会造成重复推送了。
    各位大佬你们的这个相关的是怎么设计的。
    20 条回复    2018-12-17 16:27:08 +08:00
    Kinnice
        1
    Kinnice  
       2018-12-16 12:32:52 +08:00 via Android
    redis
    rockyou12
        2
    rockyou12  
       2018-12-16 12:38:30 +08:00
    消息生产者吧未推送的消息放进队列里,用 redis、或者 kafka、rabbitmq 这些都行。发送者订阅队列然后发送,不要用定时任务循环查表表。
    uoddsa
        3
    uoddsa  
    OP
       2018-12-16 16:35:09 +08:00
    @rockyou12 谢谢,查过相关的内容,但是不定时的话,什么时候可以触发消费者进行消费呢。
    lifespy
        4
    lifespy  
       2018-12-16 16:56:18 +08:00
    分组推送,不要一次全部推送
    lihongjie0209
        5
    lihongjie0209  
       2018-12-16 16:59:26 +08:00
    这是一个并发定时任务的问题, 把定时任务设置为禁止并发执行就可以, 或者是有一个全局锁保证只有一个定时任务在运行
    opengps
        6
    opengps  
       2018-12-16 17:05:56 +08:00 via Android
    消息队列,取过的数据在就读取不到了
    rockyou12
        7
    rockyou12  
       2018-12-16 17:09:13 +08:00
    @uoddsa 发布订阅机制,生产者发布了消费者会马上知道,如果消费者消费速度慢了,消息就堆积在队列上
    CallMeReznov
        8
    CallMeReznov  
       2018-12-16 17:10:55 +08:00
    rabbitmq
    loveCoding
        9
    loveCoding  
       2018-12-16 17:23:59 +08:00
    存个任务状态标识就行了,用户量不多,不要搞那么复杂.
    MQ 作为消费者一直会有 listener 监听 topic 消息并消费,不需要干预
    wd
        10
    wd  
       2018-12-16 17:49:08 +08:00 via iPhone
    简单处理的话,每条消息加一个标记呗,表示未推送,正在推送,已经推送
    wd
        11
    wd  
       2018-12-16 17:50:19 +08:00 via iPhone
    或者就是启动任务的时候,检查下钱一个任务是不是完了。
    wuYin
        12
    wuYin  
       2018-12-16 17:56:50 +08:00 via Android
    以前用 curl_multi 硬核实现过类似推送 [允悲]
    myhot21
        13
    myhot21  
       2018-12-16 17:59:10 +08:00 via Android
    这需求和消息队列完全一样。
    agdhole
        14
    agdhole  
       2018-12-16 18:12:55 +08:00
    量小的话简单的消息队列就行,php 也有很多这方面的轮子
    hcheng
        15
    hcheng  
       2018-12-16 22:09:43 +08:00
    我们用了 flock 这个命令,老哥可以去了解下
    alcarl
        16
    alcarl  
       2018-12-16 22:34:24 +08:00 via Android
    。。。。。。。。定时任务 select 扫出来,扔到推送之前加个推送中的状态和发起推送时间就可以了,再加一个定时任务处理发起推送时间超过 10 分钟状态仍然没变成已推送的,重新改发起推送时间,重新推,还可以加个推送次数,判断推几次就不推了。。。。。。别问我怎么知道的(T _ T)
    uoddsa
        17
    uoddsa  
    OP
       2018-12-17 10:01:46 +08:00
    @rockyou12 好的,谢谢老哥。
    uoddsa
        18
    uoddsa  
    OP
       2018-12-17 10:02:46 +08:00
    @wd 现在已经有状态这个字段了,只不过是边推边改,后续的定时任务来了就拿到了上次未修改的记录了。
    uoddsa
        19
    uoddsa  
    OP
       2018-12-17 10:03:29 +08:00
    @hcheng
    @agdhole
    @loveCoding
    @CallMeReznov
    谢谢各位老哥,我参考一下~
    junbaor
        20
    junbaor  
       2018-12-17 16:27:08 +08:00
    如果是全体用户推的话那就不用这么浪费空间给每个用户存一行,我们是单独有一个全局消息表,用户拉自己消息的同时也会拉取全局消息,合并后返回给客户端。全局消息还有类似 tag 一样的东西和用户 tag 进行匹配。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1538 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 16:18 PVG 00:18 LAX 08:18 JFK 11:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86