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 시간)로 설정되어 작업이 완료 될 때까지 걸리는 시간보다 훨씬 깁니다.
ok, 너무 쉽게 해결할 수 있습니다. 로그에 복제 작업이 모두 동시에 시작됨이 표시됩니까? 아니면 비틀 거리는가? 어딘가에 앱에 시간 초과가있을 수 있습니다. 그렇지 않으면 디스패치 코드를 파헤쳐 일을 추적 할 수 있습니다. 필자는 큐잉 시스템 (php에서는 2 개, beanstalk에서는 3 개)을 작성했지만, laravel을 모른다. – Andras
중복 작업은 서로 10 초 이내에 __usually__ 시작합니다. 특히 콩나무 연결을 사용하면 앱 내부에서 시간 제한이없는 것 같습니다. 예외 나 오류가 발생하지 않습니다. 나는 그것이 콩 줄기 버그일지도 모른다고 생각하고있다. – timgws
10 초는 긴 시간이다. .. 얼마나 별났다. 당신은 파견을 할 수 있습니까? 그냥 beanstalk reserve()가 반환 한 작업 ID를 기록 하시겠습니까? 양면 검색으로 빈 줄 또는 앱으로 좁 힙니다. 시간 제한을 위해, 내장형 "10 분 후 오류 신고"가 최대 실행 시간 유형의 설정 – Andras