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

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

  •  
  •   Symo · 2017-01-16 20:05:54 +08:00 · 16786 次点击
    这是一个创建于 2629 天前的主题,其中的信息可能已经有所发展或是发生改变。
    云服务的: 阿里云 MQ, 亚马逊 SQS, IRON.IO
    开源的: beanstalkd, php-resque, gearman

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

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

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

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

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

    cron 取出后扔队列要求很快的而且 worker 不需要再验证其他逻辑了直接走关闭即可。
    ppwangs
        48
    ppwangs  
       2017-01-17 16:15:59 +08:00
    规模不大我以下想到的是用 job ,结果看回答没人用,吓死了
    s546360316
        49
    s546360316  
       2017-01-17 16:36:43 +08:00
    redis 吧,我们就是这么弄的
    niuroumian
        50
    niuroumian  
       2017-01-17 17:34:42 +08:00 via iPhone
    用 java delay queue 写一个
    julyclyde
        51
    julyclyde  
       2017-01-17 18:09:01 +08:00
    带延迟的,貌似 redis 的 list 功能不行吧?
    beanstalkd 我知道可以带。其它的不了解
    zhy0216
        52
    zhy0216  
       2017-01-18 00:27:15 +08:00
    pyrq
    sampeng
        53
    sampeng  
       2017-01-18 11:23:14 +08:00
    看你语言。。。
    静态语言单实例直接在进程内实现
    arzusyume
        54
    arzusyume  
       2017-01-18 13:04:31 +08:00
    之前看到的一个纯 redis 实现的消息队列
    https://cnodejs.org/topic/5577b493c4e7fbea6e9a33c9
    不过按时间准时触发
    cxbig
        55
    cxbig  
       2017-01-18 18:17:09 +08:00
    LZ 所指规模不大是什么概念?比方说每小时多少条?
    我司用 AWS 做架构,所以用 SQS 做队列。 200 条 /小时左右,很稳定。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2831 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:41 · PVG 22:41 · LAX 07:41 · JFK 10:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.