>PHP 프레임워크 >Laravel >Laravel이 대기열을 사용하는 이유

Laravel이 대기열을 사용하는 이유

WBOY
WBOY원래의
2022-03-14 16:45:242802검색

laravel에서는 대기열을 사용하면 대규모 동시성 및 다국어 통신 인터페이스와 같은 문제를 해결할 수 있습니다. 시간이 많이 걸리는 작업이나 동시에 많은 수를 병렬화할 수 없는 작업은 캡슐화되어 메시지 대기열로 전송될 수 있습니다. 핸들러는 메시지 대기열을 사용하여 메시지를 지속적으로 추출하여 처리할 수 있습니다. 대규모 동시성의 필요성을 제거합니다.

Laravel이 대기열을 사용하는 이유

이 기사의 운영 환경: Windows 10 시스템, Laravel 버전 6, Dell G3 컴퓨터.

라라벨이 큐를 사용하는 이유

메시지 큐는 대규모 웹 프로젝트에 필수적인 모듈입니다. 메시지 큐를 통해 대규모 동시성, 다국어 통신 인터페이스 등의 문제를 해결할 수 있습니다.

대규모 동시성 문제의 경우 시간이 많이 걸리는 작업이나 동시에 대량으로 병렬화할 수 없는 작업을 캡슐화하여 메시지 대기열로 전송할 수 있습니다. 이 경우 처리기는 메시지 대기열에서 메시지를 지속적으로 추출하여 처리합니다. 즉, 메시지 대기열의 버퍼링을 통해 대규모 동시성 상황에서 차단을 방지할 수 있습니다. 성능이 충분하지 않은 경우 여러 처리 작업을 추가하여 메시지 대기열에서 처리할 메시지를 가져올 수 있습니다.

예를 들어 데이터베이스 작업에서 데이터베이스에 대한 읽기 및 쓰기 작업이 너무 많으면 테이블 잠금과 같은 문제가 발생합니다. 읽기 문제는 캐싱 및 기타 솔루션을 통해 해결할 수 있지만 쓰기 문제는 해결해야 합니다. 메시지 대기열로 해결됩니다.

게다가 대규모 웹 프로젝트 개발에서는 하나의 언어로 구현하는 것이 불가능한 경우가 많습니다. 이론적으로는 모든 것을 할 수 있지만 PHP와 같은 다양한 언어를 활용해야 합니다. 웹 개발에서는 실시간 소켓 연결 및 분산 트랜잭션 처리와 같은 문제를 해결하는 데 이를 사용하는 효율성이 매우 낮습니다.

Laravel의 메시지 큐를 사용하여 비동기 작업을 처리하고 Redis를 큐 데이터베이스로 사용하면 Supervisor 모니터링 스크립트가 비정상적으로 중단되어 자동으로 다시 시작됩니다. 이는 큐 작업을 처리하는 Laravel의 표준 프로세스이지만 실제로는 다양한 문제가 발생할 수 있습니다. 시스템 신뢰성을 보장하기 위해서는 몇 가지 문제에 주의를 기울여야 합니다.

1. 실패한 실행에 대한 재시도 횟수 설정

무한 재시도 횟수를 초과하면 Laravel은 이를 실패한 작업에 기록합니다. 기본적으로 테이블을 작성하거나 후속 처리 로직을 직접 작성할 수 있습니다.

php artisan queue:work redis --tries=3

데이터 테이블을 생성하려면 먼저 다음 명령을 실행해야 합니다:

php artisan queue:failed-table

php artisan migration

2. 처리 프로그램 예외

프로그램 실행 중에 다른 인터페이스에 의존하거나 HTTP 인터페이스 시간 초과를 요청하는 등 예외가 발생하는 경우가 있습니다. 예외가 포착되지 않으면 현재 대기열이 중단되어 계속 실행할 수 없습니다. 10,000명의 사용자에게 콘텐츠를 제공하려면 인터페이스 푸시를 사용해야 합니다. 중간 요청이 중단되면 후속 푸시에 영향을 미칩니다.

여기서 예외는 프로그램 실행 중에 발생하는 예외를 의미합니다. 프로그램 예외로 인해 반드시 상주 프로세스가 중단되는 것은 아닙니다. 또한 감독자가 프로세스 중단을 모니터링하고 다시 시작합니다. .

예외 포착을 위한 코드 조각:

try {undefined
$r = $client->request('POST', '', [
'query' => [
'client_name' => 'filemail',
'client_version' => '1.0',
'client_sequence' => 0,
'uid' => 692934013,//119481237
'r' => 1508312484,
],
'body' => \GuzzleHttp\json_encode($body),
]);
$result = $r->getBody()->getContents();
$result = json_decode($result, true);
if ($result['result'] == 0) {undefined
info("sendMail fail:" . json_encode($result));
$this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), 0);
} else {undefined
Log::warning("sendMail fail:" . json_encode($result));
$this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), $result['result']);
}
} catch (RequestException $e) {undefined
Log::warning('RequestException' . $e->getMessage());
} catch (Exception $e) {undefined
Log::emergency('Exception' . $e->getMessage());
}

[관련 권장 사항: laravel 비디오 튜토리얼]

위 내용은 Laravel이 대기열을 사용하는 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.