uoddsa
V2EX  ›  PHP

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

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