V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
uoddsa
V2EX  ›  PHP

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

  •  
  •   uoddsa · 2018-12-16 11:39:08 +08:00 · 4674 次点击
    这是一个创建于 2168 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司现在的系统是一个推送的消息表,用户的消息记录表(用户个人中心要看到记录)。
    每次添加广播(全体推送)的时候,在消息表添加一条记录,然后在用户的消息记录表添加上了所有用户的记录...
    定时任务的间隔都是一分钟,一次拿取所有未推送的记录然后推送出去。然后这里就有一个 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   ·   实用小工具   ·   5193 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:51 · PVG 13:51 · LAX 21:51 · JFK 00:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.