2014-01-06 2 views
1

나는 콩 줄기 + 대장간에 중급입니다. Beanstalk을 사용하여 핵심 부분 (백그라운드 프로세스)을 개발 중입니다. 그것은 의심의 여지가 훌륭한 도구이지만, 나는 한 가지 상황에 처해있다. 나는 Yii 프레임 워크를 사용하여 beanstalk를 사용하고 있습니다.콩 줄기 + Pheanstalk 지연 기존 일

예를 들어 A (Tube-A-Jobs)와 B (Tube-B-Jobs)의 두 가지 직업이 있으며 두 가지 직업이 서로 다른 관과 근로자를두고 있습니다. B는 A에 종속되어 있습니다. B가 A 이전의 작업자에 의해 먼저 페치 (fetch)되고 A에서 처리가 시작될 수 있습니다. 이 경우 A가 실행될 때까지 몇 초 (120 초) 동안 지연하려면 B가 필요합니다.

제 생각에 따라 직무를 지연시키는 직접적인 방법은 없습니다. 이를 위해서는 작업 B를 삭제하고 지연 시간이있는 같은 대기열에 다시 넣어야합니다. 내가 틀렸다면 나를 바로 잡아라.

그런 상황에서 나는 실제 튜브 이름을 얻을 수 없다. 왜냐하면 pheanstalk은 작업 ID와 작업 데이터만을 제공하기 때문이다. 내가 예약 기능을 사용하여 모든 작업을 가지고 있다면 나는

$jobB = $pheanstalkB->reserve(); 

그것은 다음과 같이 출력을 줄 것이다, 지금 당신이 아래에있는 내 코드,

$pheanstalkA = Yii::app()->beanstalk->getClient($client); 
$pheanstalkA->watch('A-tube'); 

$pheanstalkB = Yii::app()->beanstalk->getClient($client); 
$pheanstalkB->watch('B-tube'); 

을 붙여있어, 우리는 그 콩나무가 아닌 볼 수 있습니다 이 직업을 가져온 튜브 이름을 제공합니다.

Pheanstalk_Job Object 
(
    [_id:Pheanstalk_Job:private] => 2 
    [_data:Pheanstalk_Job:private] => Job Data .... 
) 

우리는 내가이 일을 지연 할 시간과 같은 튜브 아래에 넣고 싶다면, 하나의 노동자, N 튜브 (들)에서 볼 수 있다는 것을 알고있다. 어떻게 우리는 직업의 튜브 이름을 찾을 수 있습니까?

감사합니다 ...

답변

4

Beanstalkd이 작업이 작업 자체에서 온 튜브를 반환하지 않습니다,하지만 당신은 그것을 조회 할 수 있습니다 - 명령 '통계 - 직업'으로. 원래 튜브 및 기타 정보를 얻고, ID를 들어, '통계-작업을'실행

put 1 0 100 5 
hello 
INSERTED 10 

reserve 
RESERVED 10 5 
hello 

stats-job 10 
OK 143 
--- 
id: 10 
tube: default 
state: reserved 
pri: 1 
age: 33 
delay: 0 
ttr: 100 
time-left: 82 
reserves: 1 
timeouts: 0 
releases: 0 
buries: 0 
kicks: 0 

는 내가 예약 (10 다시 작업-ID를 얻을)에서 간단한 작업을했습니다.

Pheanstalk는 statsJob 함수를 가지고 있습니다 (reserve에서 반환 됨).

특정 작업에 대해 얻을 수없는 것이 있으면 언제나 메타 정보를 작업 자체에 넣을 수 있습니다.

+0

고마워 Alister .. 대단한 도움 !! –

2

일부 지연 시간을 사용하여 동일한 대기열에 다시 작업을 배치하는 새로운 방법을 발견했습니다. 우리는 직접 릴리스 pheanstalk 라이브러리의 기능을 사용할 수 있습니다. 예 :

$this->pheanstalk->release($job,$priority,$delay); 

이렇게하면 우리는 작업의 실제 튜브를 찾을 필요가 없으며 특히 내 경우에는 동시성 문제를 줄일 수 있습니다.

도움 주셔서 감사합니다.