Symo
V2EX  ›  PHP

规模不大的项目大家用什么做延时消息队列?

  •  
  •   Symo · Jan 16, 2017 · 18559 views
    This topic created in 3579 days ago, the information mentioned may be changed or developed.
    云服务的: 阿里云 MQ, 亚马逊 SQS, IRON.IO
    开源的: beanstalkd, php-resque, gearman

    我知道的大概是这些, 国外的云服务应该是不用考虑的, 网络是最大的障碍.
    beanstalkd 最后一个 release 居然是 2014 年的, 但是 github 上还有今年的 pr. 也不知道是什么情况
    一般用作延时关闭订单, 定时推送任务这种需求, 轻量级的用什么比较好?
    55 replies  •  2017-01-18 18:17:09 +08:00
    pubby
    pubby
    Jan 16, 2017 via Android
    1
    beanstalkd
    mercurylanded
    mercurylanded
    Jan 16, 2017
    2
    activemq/rabbitmq
    timothyye
    timothyye
    Jan 16, 2017 via Android
    3
    beanstalkd
    timothyye
    timothyye
    Jan 16, 2017 via Android
    4
    beanstalkd+1
    sneezry
    sneezry
    Jan 16, 2017 via iPhone
    5
    Azure 有 Event Hub
    22too
    22too
    Jan 16, 2017
    6
    rabbitmq 推荐
    z5864703
    z5864703
    Jan 16, 2017
    7
    laravel 自带的队列服务
    loveshouhu
    loveshouhu
    Jan 16, 2017
    8
    nsq
    vus520
    vus520
    Jan 16, 2017
    9
    那专门挑一个不一样的, redis
    R18
    R18
    Jan 16, 2017 via Android
    10
    我也是用 redis
    doubleflower
    doubleflower
    Jan 16, 2017
    11
    第一次看到 beanstalkd ,看了下文档感觉小而强大啊
    shiny
    shiny
    PRO
    Jan 16, 2017
    12
    redis + 自己写的 node 定时器,定时触发 web 请求。
    lbp0200
    lbp0200
    Jan 16, 2017 via Android
    13
    redis
    snnn
    snnn
    Jan 16, 2017 via Android
    14
    kafka
    ety001
    ety001
    Jan 17, 2017 via iPhone
    15
    httpsqs
    sudoz
    sudoz
    Jan 17, 2017
    16
    redis 就行了
    mengskysama
    mengskysama
    Jan 17, 2017 via iPhone
    17
    所以楼上这么多说 redis , nsq 的是怎么实现延迟消息队列的...
    dangyuluo
    dangyuluo
    Jan 17, 2017
    18
    @mengskysama 可能是定时任务吧。
    janxin
    janxin
    Jan 17, 2017 via iPhone
    19
    @mengskysama 量小自己做个定时器就好了
    pubby
    pubby
    Jan 17, 2017 via Android
    20
    @mengskysama 一样,比较好奇 redis 怎么实现延迟的
    ihuotui
    ihuotui
    Jan 17, 2017
    21
    @pubby sort set 哈哈
    enenaaa
    enenaaa
    Jan 17, 2017
    22
    直接用数据库嘛, 查询时加个执行时间条件。
    lujiajing1126
    lujiajing1126
    Jan 17, 2017 via iPhone
    23
    rmq 。 httpsqs 也挺好的
    pubby
    pubby
    Jan 17, 2017
    24
    @ihuotui 按执行时间戳排序?取第一个然后自己等待?
    jarlyyn
    jarlyyn
    Jan 17, 2017
    25
    延时关闭订单 /定时发送邮件和队列关系不大不啊?

    主要是 Cron 吧?
    ihuotui
    ihuotui
    Jan 17, 2017
    26
    @pubby 值是时间戳,然后和现在的时间对比,找过期的时间啊,有一个任务不到扫描,看频率需求多高。
    yidinghe
    yidinghe
    PRO
    Jan 17, 2017
    27
    定时的消息处理对时间精度要求不高的话,完全可以轮询
    slixurd
    slixurd
    Jan 17, 2017
    28
    @jarlyyn 如果用 cron 的话会比较尴尬...
    因为一般有多台服务器,不可避免的需要用 Quartz 这种分布式调度系统
    然后如果数据量大,还得多台消费者.
    这种情况下用消息队列会方便很多,可以横向扩展....
    redis 当然可以实现,sorted set 就很简单
    不过 redis 有问题啊= =
    作为一个 kv 存储.有事务,但是不能回滚...
    细节上有各种问题,例如保证不被重复消费,消费失败让其他节点接着重试....
    yubang
    yubang
    Jan 17, 2017
    29
    rabbitmq +1
    jarlyyn
    jarlyyn
    Jan 17, 2017
    30
    @slixurd

    关闭订单为啥要多台服务器……
    pubby
    pubby
    Jan 17, 2017
    31
    @ihuotui 好吧,那些都是要延迟一小时的任务,突然有个新任务需要插队立即处理。
    boneyao
    boneyao
    Jan 17, 2017
    32
    celery? 算不算?
    slixurd
    slixurd
    Jan 17, 2017
    33
    @jarlyyn 数据量大怎么办 =w=...
    哦不对,我错了,楼主已经写了规模不大的项目....
    不过健壮的服务一般都会避免单点,大小型服务都得做下保障...
    jarlyyn
    jarlyyn
    Jan 17, 2017 via Android
    34
    @slixurd

    数据量大到一台单独的只跑关闭订单服务的服务器都不够么。。。
    iyaozhen
    iyaozhen
    Jan 17, 2017 via Android
    35
    数量不大 redis ,用 lpush , rpop
    数量大用 kafka
    目前的最佳实践
    ihuotui
    ihuotui
    Jan 17, 2017 via iPhone
    36
    @pubby 时间值设置 0 啊……
    ihuotui
    ihuotui
    Jan 17, 2017 via iPhone
    37
    @slixurd 数据完整性,参考数据库怎么保证,再增加一个消费 set ,处理前把消息放在 set 里面,处理完把 key 清除,办法有很多。然后就是消费信息的唯一性了要幂等操作。
    Mirana
    Mirana
    Jan 17, 2017
    38
    epoll_wait 有个 timeout 参数,在一组任务中取 timeout 最小的值作为 epoll_wait 的参数

    把任务用查询树的结构来存储比如红黑树和跳表就可以实现延迟消息队列
    wesley
    wesley
    Jan 17, 2017
    39
    fastcgi_finish_request();
    slixurd
    slixurd
    Jan 17, 2017
    40
    @jarlyyn 比如说,需要精确到秒级延迟的一些系统,1s-2s 左右执行一次
    其实处理不了几条数据的....还有各种乱七八糟的外部调用之类的...
    slixurd
    slixurd
    Jan 17, 2017
    41
    @ihuotui 可以啊,但是这些相当于都需要在 client 处理,只是需要自己去实现
    就看怎么写的简单易用了...
    都是细节问题...又不是不能做
    pubby
    pubby
    Jan 17, 2017
    42
    @iyaozhen 延时,延时
    327beckham
    327beckham
    Jan 17, 2017
    43
    ruby resque
    Felldeadbird
    Felldeadbird
    Jan 17, 2017
    44
    既然规模不大,直接 cron 触发 数据库要发送的数据不就好了么
    sarices
    sarices
    Jan 17, 2017
    45
    httpsqs
    lyragosa
    lyragosa
    Jan 17, 2017
    46
    看楼上说得都好高端
    用 cron 的都瑟瑟发抖不敢说话了……
    cevincheung
    cevincheung
    Jan 17, 2017
    47
    表示 cron 取出所有数据后挨个队列的路过。

    cron 取出后扔队列要求很快的而且 worker 不需要再验证其他逻辑了直接走关闭即可。
    ppwangs
    ppwangs
    Jan 17, 2017
    48
    规模不大我以下想到的是用 job ,结果看回答没人用,吓死了
    s546360316
    s546360316
    Jan 17, 2017
    49
    redis 吧,我们就是这么弄的
    niuroumian
    niuroumian
    Jan 17, 2017 via iPhone
    50
    用 java delay queue 写一个
    julyclyde
    julyclyde
    Jan 17, 2017
    51
    带延迟的,貌似 redis 的 list 功能不行吧?
    beanstalkd 我知道可以带。其它的不了解
    zhy0216
    zhy0216
    Jan 18, 2017
    52
    pyrq
    sampeng
    sampeng
    Jan 18, 2017
    53
    看你语言。。。
    静态语言单实例直接在进程内实现
    arzusyume
    arzusyume
    Jan 18, 2017
    54
    之前看到的一个纯 redis 实现的消息队列
    https://cnodejs.org/topic/5577b493c4e7fbea6e9a33c9
    不过按时间准时触发
    cxbig
    cxbig
    Jan 18, 2017
    55
    LZ 所指规模不大是什么概念?比方说每小时多少条?
    我司用 AWS 做架构,所以用 SQS 做队列。 200 条 /小时左右,很稳定。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5025 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 132ms · UTC 01:47 · PVG 09:47 · LAX 17:47 · JFK 20:47
    ♥ Do have faith in what you're doing.