在工作中,我们需要构建一个作业服务器,用于发送电子邮件,构建PDF,处理一些数据等.显然,我们希望建立一些通用的排队系统.我熟悉Gearman,这是它试图解决的确切问题:将工作放在工作人员来接他们的队列中.但是,我看到很多关于Rabbitmq的提及,我不清楚它在这种情况下是如何使用的.
Rabbitmq是构建分布式作业系统的好框架吗?
我有许多Gearman工作人员不断运行,保存用户页面视图记录等内容.偶尔,我会更新Gearman工作人员使用的PHP代码.为了让工作人员切换到新代码,我杀死并重新启动工作人员的PHP进程.
有什么更好的方法呢?据推测,当我杀死其中一个工作进程时,我有时会丢失数据(尽管不是非常重要的数据).
编辑:我找到了一个适合我的答案,并在下面发布.
我们使用PHP gearman worker并行运行各种任务.一切都运行得很好,我有愚蠢的小shell脚本,当我想要它们时将它们旋转起来.作为一名程序员(因此也是懒惰的),我想看看我是否可以通过一个新手脚本来解决这些问题.
我想出了如何使用实例节,所以我可以使用实例编号启动它们:
description "Async insert workers"
author "Mike Grunder"
env SCRIPT_PATH="/path/to/my/script"
instance $N
script
php $SCRIPT_PATH/worker.php
end script
Run Code Online (Sandbox Code Playgroud)
这很好用,就像这样开始它们:
sudo start async-worker N=1
sudo start async-worker N=2
Run Code Online (Sandbox Code Playgroud)
我想要使用这些工作者的方法是调整其中的一些(可能每个核心一个等),我想在启动时这样做.要清楚,我不需要upstart脚本来检测核心数量.我很高兴只说"做8个实例",但这就是我想要多次运行的原因.有没有办法让我在upstart脚本中使用"start on"子句自动执行此操作?
例如,启动实例1,2,3,4?然后让它们在关机时正常退出?
我想我可以将它挂钩到init.d脚本中,但我想知道upstart是否可以处理这样的事情,或者是否有人已经弄清楚了这个问题.
干杯啦!
我希望能够查询一个gearman服务器来确定我运行的一个工人的实例数(基本上我想确保它RunTaskA
可用并且RunTaskB
如果没有工人处理这些任务就可用,我希望能够发送警惕.
有没有办法做到这一点?
另外:疯狂的道具,如果你知道一种PHP方式来查询gearman服务器.
编辑:我知道本地可用的PHP gearman扩展,但我不是在寻找任务提交扩展,我需要一些东西,允许我查询gearman服务器,看看有多少工人正在为特定任务服务.
我在ubuntu 12.04上使用Supervisor(3.0a12)来管理php gearman worker.有时,工人陷入一种奇怪的状态,他们使用大量的cpu和ram.虽然我正在解决这个问题,但我认为让Supervisor偶尔会自动杀死并刷新工作人员会很好.我查看了http://supervisord.org/configuration.html配置文档,似乎没有看到任何允许这样做的选项.
有谁知道是否有可能让supervisord定期重启它管理的所有进程?
我有一个使用Gearman的问题,当我通过Gearman PHP扩展发送大量有效载荷时,将任务传输给工人的速度很慢.事实上,我们没有发现有效载荷那么大(它是30MB).一切(PHP,Gearman,节点)暂时在本地运行,因此网络访问不是瓶颈.
PHP脚本
这是PHP客户端:
ini_set('memory_limit', '1G');
$client= new GearmanClient();
$client->addServer('127.0.0.1', '4730');
$schema = file_get_contents('schema.json');
$data = file_get_contents('data.json');
$gearmanData = [
'schema' => $schema,
'data' => $data
];
echo "Encoding in JSON the payload\n";
$gearmanDataString = json_encode($gearmanData, JSON_FORCE_OBJECT);
echo "Sending job to Gearman\n";
// This line takes long to execute...
$result = $client->doNormal("validateJsonSchema", $gearmanDataString);
echo "Job finished\n";
var_dump($result);
Run Code Online (Sandbox Code Playgroud)
这是我的nodejs worker,它最终会做一些事情,但是为了证明工作者代码不是问题而是空的:
var gearmanode = require('gearmanode');
var worker = gearmanode.worker({host: '127.0.0.1' port: 4730});
worker.addFunction('validateJsonSchema', function (job) {
console.log('I will do something');
job.workComplete('Toasty!');
}); …
Run Code Online (Sandbox Code Playgroud) 有没有办法从Gearman作业服务器中删除所有Gearman作业?我有一个PHP应用程序在后台运行Gearman作业.对于我的单元测试,我需要确保a)没有工作等待执行它的工人和b)没有工人工作.后者并不重要,因为它很容易杀死工人而前者 - 我不知道如何实现这一点.
我有一些齿轮工作的客户发送工作,比如job1.
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
Run Code Online (Sandbox Code Playgroud)
处理这项工作需要10秒钟.我想跟踪有多少'job1'工作等待工人在任何给定时间工作.我怎样才能做到这一点?
我正在寻找一个全面的Gearman教程(最好使用PHP API).我试图了解这个过程的流程.我将守护进程设置为运行,创建客户端和工作程序,但如何使用Gearman处理它们(如添加/删除工作程序等)?
当查看php gearman文档时,我看到有任务和做,他们都有背景和非背景,他们也都有高低和正常.
谁能澄清这些?我只是对这种差异感到困惑.