V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
uoddsa
V2EX  ›  PHP

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

  •  
  •   uoddsa · Dec 16, 2018 · 5248 views
    This topic created in 2689 days ago, the information mentioned may be changed or developed.
    公司现在的系统是一个推送的消息表,用户的消息记录表(用户个人中心要看到记录)。
    每次添加广播(全体推送)的时候,在消息表添加一条记录,然后在用户的消息记录表添加上了所有用户的记录...
    定时任务的间隔都是一分钟,一次拿取所有未推送的记录然后推送出去。然后这里就有一个 bug,前一分钟拿到的所有记录未推送完,也就是推送的状态未修改完,下次推送的定时任务有进行,就会造成重复推送了。
    各位大佬你们的这个相关的是怎么设计的。
    20 replies    2018-12-17 16:27:08 +08:00
    Kinnice
        1
    Kinnice  
       Dec 16, 2018 via Android
    redis
    rockyou12
        2
    rockyou12  
       Dec 16, 2018
    消息生产者吧未推送的消息放进队列里,用 redis、或者 kafka、rabbitmq 这些都行。发送者订阅队列然后发送,不要用定时任务循环查表表。
    uoddsa
        3
    uoddsa  
    OP
       Dec 16, 2018
    @rockyou12 谢谢,查过相关的内容,但是不定时的话,什么时候可以触发消费者进行消费呢。
    lifespy
        4
    lifespy  
       Dec 16, 2018
    分组推送,不要一次全部推送
    lihongjie0209
        5
    lihongjie0209  
       Dec 16, 2018
    这是一个并发定时任务的问题, 把定时任务设置为禁止并发执行就可以, 或者是有一个全局锁保证只有一个定时任务在运行
    opengps
        6
    opengps  
       Dec 16, 2018 via Android
    消息队列,取过的数据在就读取不到了
    rockyou12
        7
    rockyou12  
       Dec 16, 2018
    @uoddsa 发布订阅机制,生产者发布了消费者会马上知道,如果消费者消费速度慢了,消息就堆积在队列上
    CallMeReznov
        8
    CallMeReznov  
       Dec 16, 2018
    rabbitmq
    loveCoding
        9
    loveCoding  
       Dec 16, 2018
    存个任务状态标识就行了,用户量不多,不要搞那么复杂.
    MQ 作为消费者一直会有 listener 监听 topic 消息并消费,不需要干预
    wd
        10
    wd  
       Dec 16, 2018 via iPhone
    简单处理的话,每条消息加一个标记呗,表示未推送,正在推送,已经推送
    wd
        11
    wd  
       Dec 16, 2018 via iPhone
    或者就是启动任务的时候,检查下钱一个任务是不是完了。
    wuYin
        12
    wuYin  
       Dec 16, 2018 via Android
    以前用 curl_multi 硬核实现过类似推送 [允悲]
    myhot21
        13
    myhot21  
       Dec 16, 2018 via Android
    这需求和消息队列完全一样。
    agdhole
        14
    agdhole  
       Dec 16, 2018
    量小的话简单的消息队列就行,php 也有很多这方面的轮子
    hcheng
        15
    hcheng  
       Dec 16, 2018
    我们用了 flock 这个命令,老哥可以去了解下
    alcarl
        16
    alcarl  
       Dec 16, 2018 via Android
    。。。。。。。。定时任务 select 扫出来,扔到推送之前加个推送中的状态和发起推送时间就可以了,再加一个定时任务处理发起推送时间超过 10 分钟状态仍然没变成已推送的,重新改发起推送时间,重新推,还可以加个推送次数,判断推几次就不推了。。。。。。别问我怎么知道的(T _ T)
    uoddsa
        17
    uoddsa  
    OP
       Dec 17, 2018
    @rockyou12 好的,谢谢老哥。
    uoddsa
        18
    uoddsa  
    OP
       Dec 17, 2018
    @wd 现在已经有状态这个字段了,只不过是边推边改,后续的定时任务来了就拿到了上次未修改的记录了。
    uoddsa
        19
    uoddsa  
    OP
       Dec 17, 2018
    @hcheng
    @agdhole
    @loveCoding
    @CallMeReznov
    谢谢各位老哥,我参考一下~
    junbaor
        20
    junbaor  
       Dec 17, 2018
    如果是全体用户推的话那就不用这么浪费空间给每个用户存一行,我们是单独有一个全局消息表,用户拉自己消息的同时也会拉取全局消息,合并后返回给客户端。全局消息还有类似 tag 一样的东西和用户 tag 进行匹配。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5398 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 112ms · UTC 03:50 · PVG 11:50 · LAX 20:50 · JFK 23:50
    ♥ Do have faith in what you're doing.