2014-11-10 4 views
8

Laravel 4.2 프레임 워크로 작성된 간단한 웹 응용 프로그램이 있습니다. 새 큐 항목을 로컬로 실행중인 beastalkd 서버에 추가하도록 Laravel 큐 구성 요소를 구성했습니다.여러 대기열 수신기가 여러 프로세스에서 동일한 작업을 실행합니다.

기본적으로, beanstalkd 튜브에 항목을 추가하는 POST 경로가 있습니다.

그런 다음 artisan queue:listen을 세 개의 별도 프로세스로 실행하도록 감독관을 설정하십시오. 내가보고있는 문제는 서로 다른 queue:listen 프로세스가 하나의 삽입 된 작업에 대해 하나의 프로세스에서 세 개의 프로세스로 어디서나 스폰되도록하는 것입니다().

대기열에 삽입 된 하나의 작업이 동시에 여러 작업자에 의해 처리되는 경우가 있으므로 분명히 피하려고합니다.

는 작업 코드는 비교적 간단하다 :

<?php 

use App\Repositories\URLRepository; 

class ProcessDataJob { 
    private $urls; 

    public function __construct(URLRepository $urls) 
    { 
     $this->urls = $urls; 
    } 

    public function fire($job, $data) 
    { 
     $input = $data['post']; 

     if (!isset($data['post']) && !is_array($data['post'])) { 
      Log::error('[Job #'.$job->getJobId().'] $input was empty inside CreateAuditJob. Deleting job. Quitting. Bye!'); 
      $job->delete(); 
      return false; 
     } 

     // 
     // ... code that will take a few hours to run. 
     // 

     $job->delete(); 
     Log::info('[Job #'.$job->getJobId().'] ProcessDataJob was successful, deleting the job!'); 
     return true; 
    } 
} 

되는 재미있는 부분이 오류 로그에서이 왼쪽으로 작업을 삭제할 때 노동자들이 실패 (중복) 큐의 대부분 :

exception 'Pheanstalk_Exception_ServerException' with message 'Job 3248 NOT_FOUND: does not exist or is not reserved by client' 

ttr (실행 시간)은 172,800 초 (또는 48 시간)로 설정되어 작업이 완료 될 때까지 걸리는 시간보다 훨씬 깁니다.

답변

3

대기중인 time_to_run이란 무엇입니까? 작업 실행 시간이 time_to_run 초보다 오래 걸리면 작업이 자동으로 대기열에 다시 들어가고 다음 작업자가 실행할 자격이됩니다.

예약 된 작업에는 삭제, 릴리스 또는 감광 될 time_to_run 초가 있습니다. touch()을 호출하면 제한 시간 타이머가 다시 시작되므로 작업자가 시간 초과 타이머를 사용하여 완료 할 시간을 늘릴 수 있습니다. 또는 큐잉 할 때 충분히 큰 값을 사용하십시오.

난 당신이 Laravel 실행되기 때문에 https://github.com/kr/beanstalkd/blob/master/doc/protocol.md

+0

ok, 너무 쉽게 해결할 수 있습니다. 로그에 복제 작업이 모두 동시에 시작됨이 표시됩니까? 아니면 비틀 거리는가? 어딘가에 앱에 시간 초과가있을 수 있습니다. 그렇지 않으면 디스패치 코드를 파헤쳐 일을 추적 할 수 있습니다. 필자는 큐잉 시스템 (php에서는 2 개, beanstalk에서는 3 개)을 작성했지만, laravel을 모른다. – Andras

+0

중복 작업은 서로 10 초 이내에 __usually__ 시작합니다. 특히 콩나무 연결을 사용하면 앱 내부에서 시간 제한이없는 것 같습니다. 예외 나 오류가 발생하지 않습니다. 나는 그것이 콩 줄기 버그일지도 모른다고 생각하고있다. – timgws

+0

10 초는 긴 시간이다. .. 얼마나 별났다. 당신은 파견을 할 수 있습니까? 그냥 beanstalk reserve()가 반환 한 작업 ID를 기록 하시겠습니까? 양면 검색으로 빈 줄 또는 앱으로 좁 힙니다. 시간 제한을 위해, 내장형 "10 분 후 오류 신고"가 최대 실행 시간 유형의 설정 – Andras

2

도움이 beanstalkd 프로토콜 문서를 발견했습니다, 당신의 queue.php 구성 파일을 확인합니다.

ttr 값을 60 (기본값)에서 다른 값으로 변경하십시오.

'beanstalkd' => array(
     'driver' => 'beanstalkd', 
     'host' => 'localhost', 
     'queue' => 'default', 
     'ttr' => 600, //Example 
    ), 
관련 문제