SVN+Gearman构建异步式代码分布系统

1.场景说明 任何一种方法都是为了解决或改进现有的问题。随着SVN服务器版本库增多,代码量增多,随之而来的就面临着SVN服务器压力的问题。为了开发测试,一般在每个版本库的hooks下配置个钩子,来实现代码自动同步,如:http://www.ttlsa.com/html/1047.html 这种方案是客户端每一次commit操作触动post-commit脚本执行,将代码update到本地后,再rsync到测试环境下。这存在潜在的问题,如磁盘IO,客户端提交时间(监控改变的目录,仅仅对改变的目录进行update操作比对整个项目进行update操作快)。
for dir in `svnlook dirs-changed /www/www.ttlsa.com`
 do
 svn update -N /www/project/$dir
 done
2.思路说明 将checkout/update操作转移到其他服务器上进行,比如测试环境下。客户端每一次commit操作仅仅是发送一次update操作命令,交由相关的服务器去完成你所要进行的操作。 可以采用SVN+Gearman来实现上述功能,解决面临的问题。 3.环境设置 a. SVN安装以及相关内容参见: http://www.ttlsa.com/html/category/os/web-application/svn b. Gearman Server安装,PHP扩展以及相关内容参见: http://www.ttlsa.com/html/category/os/distributed-software-systems/distributed-processing-systems/gearman-distributed-processing-systems c.Peal相关模块安装,如Gearman::Worker,Gearman::Client,JSON等等 4.实现步骤 a). Gearman Worker如下:(在测试服务器下运行)
#!/usr/bin/perl
#
############################
# author: www.ttlsa.com
# QQ群: 39514058
# E-mail: [email protected]
#############################
#
use JSON;
use strict;
use Gearman::Worker;
#
my $worker=new Gearman::Worker;
$worker->job_servers('192.168.1.111:4730');
$worker->register_function(work_SVNUPDATE_01=>\&svnupdate);
$worker->work while 1;
#
sub svnupdate{
my $job=shift;
my $json=JSON->new->allow_nonref;
my $hash_ref = $json->decode($job->arg);
my $repo=$$hash_ref{'repo'};
my $user=$$hash_ref{'user'};
my $password=$$hash_ref{'password'};
chdir "/www/web";
if ( -e -d "/www/web/$repo"){
system("svn up /www/web/$repo --username=$user --password=$password --no-auth-cache");
system("chown -R nobody.nobody /www/web/$repo");
}else{
system("svn co svn://192.168.1.222/web/$repo --username=$user --password=$password --no-auth-cache");
system("chown -R nobody.nobody /www/web/$repo");
}
}
b). Gearman Client如下:(每个项目hoods下)
/*
############################
# author: www.ttlsa.com
# QQ群: 39514058
# E-mail: [email protected]
#############################
*/
#!/usr/bin/php
<?php
$args=array('repo'=&gt;'www.ttlsa.com',
'user'=&gt;'root',
'password'=&gt;'www.ttlsa.com');
$arg=json_encode($args);
$gearman_client = new GearmanClient();
$gearman_client-&gt;setTimeout(1000);
$gearman_client-&gt;addServers('192.168.1.111:4730');
$gearman_client-&gt;addTaskBackground("work_SVNUPDATE_01", $arg);
$gearman_client-&gt;runTasks();
?>
注意: a. Gearman Client是使用php来实现的。 Perl添加异步任务不成功,会一直等待worker响应。 b. 要添加异步任务。如果添加同步任务的话,会阻塞的。

你可能感兴趣的:(json,SVN,Gearman::Client,Gearman::Worker)