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

2017-01-16 20:05:54 +08:00
 Symo
云服务的: 阿里云 MQ, 亚马逊 SQS, IRON.IO
开源的: beanstalkd, php-resque, gearman

我知道的大概是这些, 国外的云服务应该是不用考虑的, 网络是最大的障碍.
beanstalkd 最后一个 release 居然是 2014 年的, 但是 github 上还有今年的 pr. 也不知道是什么情况
一般用作延时关闭订单, 定时推送任务这种需求, 轻量级的用什么比较好?
17080 次点击
所在节点    PHP
55 条回复
ihuotui
2017-01-17 09:03:28 +08:00
@pubby sort set 哈哈
enenaaa
2017-01-17 09:27:34 +08:00
直接用数据库嘛, 查询时加个执行时间条件。
lujiajing1126
2017-01-17 09:36:49 +08:00
rmq 。 httpsqs 也挺好的
pubby
2017-01-17 10:56:02 +08:00
@ihuotui 按执行时间戳排序?取第一个然后自己等待?
jarlyyn
2017-01-17 11:00:38 +08:00
延时关闭订单 /定时发送邮件和队列关系不大不啊?

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

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

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

把任务用查询树的结构来存储比如红黑树和跳表就可以实现延迟消息队列
wesley
2017-01-17 14:21:43 +08:00
fastcgi_finish_request();
slixurd
2017-01-17 14:37:12 +08:00
@jarlyyn 比如说,需要精确到秒级延迟的一些系统,1s-2s 左右执行一次
其实处理不了几条数据的....还有各种乱七八糟的外部调用之类的...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334992

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX