这是我的需求:
Resque和beanstalkd不执行enqueue_in.
有一个插件(resque_scheduler)可以做到这一点,但我不确定它是多么稳定.
我们的环境是关于亚马逊的,他们为亚马逊实例免费推出了beanstalkd,这对我们来说是一个加分,但我仍然不确定这里最好的选择是什么.
我们运行rails 2.3但是我们很快就将其加速到rails 3.0.3.
但这里我最好的选择是什么?我错过了另一个更好地完成这项工作的宝石吗?
我觉得我现在唯一可行的选择是resque_scheduler.
编辑:
Sidekiq(https://github.com/mperham/sidekiq)是另一个你应该检查的选项.
有谁知道一个可以监视beanstalkd队列的应用程序?我正在寻找显示管和工作统计数据的东西,并允许您检查细节.
我对语言/平台并不是很挑剔,只是想在我自己编写之前知道是否有某些东西.
我有一个上帝脚本,应该留意两个跟踪者进程.问题是24小时后启动的过程太多了.
这是神剧本.
rails_root = File.expand_path("../..", __FILE__)
2.times do |n|
God.watch do |w|
w.group = "app-scripts"
w.name = "run-#{n}"
w.interval = 30.seconds
w.dir = File.dirname(__FILE__)
w.env = {
"BUNDLE_GEMFILE" => "#{rails_root}/Gemfile",
"RAILS_ENV" => "production",
"BEANSTALK_URL" => "beanstalk://127.0.0.1:54132"
}
w.start = "bbundle exec stalk #{File.join(rails_root, "config/jobs.rb")}"
w.start_grace = 5.seconds
w.stop_grace = 5.seconds
w.start_if do |start|
start.condition(:process_running) { |c| c.running = false }
end
w.restart_if do |restart|
restart.condition(:memory_usage) do |c|
c.above = 200.megabytes
c.times = [3, 5]
end
restart.condition(:cpu_usage) do |c|
c.above …
Run Code Online (Sandbox Code Playgroud) 我在我的服务器上安装了beanstalk,并运行以下命令:
$ telnet localhost 11300
use my_tube
USING my_tube
peek-ready
FOUND 11065 41
{"ts":1295537419,"data":{"nid":"212156"}}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如何获得队列中所有作业的列表; 类似的东西peek-all
?
我在Laravel中为我的处理脚本设置了队列.我正在使用beanstalkd和supervisord.有6种不同的管用于不同类型的加工.
问题在于,对于每个管子,工匠每秒都在不断地产生工人.工作者代码似乎睡了1秒然后工作线程使用7-15%cpu,乘以6管......我想每管多个工人......我的cpu被吃掉了.
我尝试将1秒睡眠改为10秒.这有助于但是当工人们醒来时,每10秒仍有一个巨大的CPU峰值.我现在甚至没有处理任何事情,因为队列完全是空的,只是工人正在寻找要做的事情.
当我在浏览器中刷新页面并且徘徊在10%左右时,我还测试了laravel的cpu使用情况.我现在正处于低端机架空间实例,这样可以解释它但仍然......看起来像每当他们醒来时,工人就会开出一个laravel实例.
有没有办法解决这个问题?我是否只需要将更多的钱投入更昂贵的服务器,以便能够听取工作是否准备就绪?
编辑:
找到一个解决方案...它不是使用工匠队列:监听器或队列:工作我查看了队列代码,似乎没有解决这个问题的方法,它需要laravel加载每次工人检查做更多的工作.
相反,我使用pheanstalk编写了自己的监听器.我仍然使用laravel将事物推入队列,然后我的自定义侦听器正在解析队列数据,然后触发一个artisan命令来运行.
现在我的侦听器的cpu使用率在%0以下,我的cpu现在唯一的时间就是当它实际找到工作然后触发命令时,我很好.
我们有一个很大的项目即将推出,有很多媒体处理(图像,视频)以及电子邮件输出等,通常我们将这些东西放入一个名为"email_queue"的表中,我们使用cron来运行脚本处理表中的队列.
我已经在像Beanstalkd这样的Message Queue系统上阅读了很多内容,甚至还设置了它.这很容易使用,问题是我不确定我是否遗漏了一些东西.
有人可以详细说明使用队列系统而不是表和CRON的好处吗?因为我真的看不到它们是什么.
谢谢
我已将一些作业添加到laravel中的队列中.但是,我忘$job->delete()
了输入函数,我的函数也有错误.这意味着工作永无止境.它不断进入它并在我的日志文件中保持错误.如何从命令行中删除它?
我正在使用beanstalkf进行排队.
我想使用Zend Framework 2控制器在php中为beanstalkd编写一个worker .它通过CLI启动并将永久运行,从此示例中请求来自beanstalkd的作业.
在简单的伪类代码中:
while (true) {
$data = $beanstalk->reserve();
$class = $data->class;
$params = $data->params;
$job = new $class($params);
$job();
}
Run Code Online (Sandbox Code Playgroud)
在$job
这里有一个__invoke()
过程的方法.但是,这些工作中的某些事情可能会持续很长时间.有些可能会运行相当大的内存.有些人可能注入了$beanstalk
对象,自己开始新的工作,或者有一个Zend\Di\Locator
实例从DIC中提取对象.
我很担心这种设置对于在长期的生产环境,为可能的循环引用可能会产生,(此时)我不明确"做"任何垃圾回收,而这个动作可能运行数周/月/年*.
*)在beanstalk中,reserve
是一个阻塞调用,如果没有可用的作业,这个worker将等到从beanstalk获得任何响应.
我的问题:php如何长期处理这个问题,我是否应该采取任何特殊的预防措施来防止这种情况发生?
我确实考虑过并且可能会有所帮助(但如果我错了请更正并在可能的情况下添加更多内容):
$job
在每次迭代中取消设置__destruct()
从a中明确取消引用$job
(注意:从这里更新)
我确实用任意工作进行了一些测试.我包括的工作是:"简单",只是设置一个值; "longarray",创建一个包含1,000个值的数组; "producer",让循环注入$pheanstalk
并向队列添加三个simplejobs(所以现在有一个从job到beanstalk的引用); "locatoraware",其中Zend\Di\Locator
给出了a 并且实例化了所有作业类型(尽管未调用).我在队列中添加了10,000个作业,然后我将所有作业保留在队列中.
"simplejob"的结果(每1000个工作的内存消耗,有memory_get_usage()
)
0: 56392
1000: 548832
2000: 1074464
3000: 1538656
4000: 2125728
5000: 2598112
6000: …
Run Code Online (Sandbox Code Playgroud) php memory garbage-collection command-line-interface beanstalkd
由于配置错误,我将VPS从CentOs 6迁移到CentOs 7,重新开始.除此之外,我还在CentOs 6上安装了beanstalkd服务.
当时我已经按照本教程访问http://viewsfromtheside.com/2014/06/12/install-beanstalkd-centos-6/,它对我来说非常有用.
但现在,我无法在我的CentOs 7版本上安装Beanstalkd.
我将这些行用于EPEL回购:
# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
# rpm -ivh epel-release-7-2.noarch.rpm
Run Code Online (Sandbox Code Playgroud)
然后我尝试了:
# yum install beanstalkd --enablerepo=epel-testing
Run Code Online (Sandbox Code Playgroud)
并且:
# yum --disablerepo="*" --enablerepo="epel" list available | grep 'beanstalkd'
Run Code Online (Sandbox Code Playgroud)
乃至 :
# yum search beanstalkd
Run Code Online (Sandbox Code Playgroud)
但仍然:找不到匹配:beanstalkd ...
我是CentOs和EPEL repos的新手,所以也许我错过了什么?无论如何,我如何在CentOs 7上安装Beanstalkd?
使用Beanstalkd和队列的数据库驱动程序有很大区别吗?
一些优点和缺点是什么?数据库队列似乎更容易设置和运行,我应该知道如何使用它?
在有关它的文档中没有真正的解释.