Laravel의 비동기 처리를 위해 꼭 필요한 개념인 Queue에 대해서 알아보고자 한다.
CS에서의 queue란 개념은 컴퓨터에서의 작업 및 데이터를 처리하기 위한 기본적인 구조를 의미한다. 선입 선출(FIFO)방식으로 동작한다는 특징을 가지고 있다.
Laravel의 queue란 시간이 오래 걸리는 작업에 대해서 사용자가 해당 작업을 기다리지 않게끔 하기 위해서 백그라운드에서 처리(비동기 방식)를 할 수 있게끔 해주는 기능이다. 실제 queue를 이용한 비동기 처리를 할 때의 구조가 자료구조 queue를 기반으로 동작한다.
queue를 사용하기 위해서는 우선 queue의 설정을 하는 것이 필요한데, 해당 파일은 config/queue.php에서 설정이 가능하며, 주요 설정은 아래와 같다.
<?php
return [
// 기본 처리 설정
'default' => env('QUEUE_CONNECTION', 'sync'),
// 각 커넥트 설정
'connections' => [
// 동기로 즉각 처리
'sync' => [
'driver' => 'sync',
],
// DB에서 관리
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
'after_commit' => false,
],
// Laravel전용 queue서버인 Beanstalkd에서 관리
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'retry_after' => 90,
'block_for' => 0,
'after_commit' => false,
],
// AWS queue서비스인 sqs를 사용하여 관리
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'default'),
'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'after_commit' => false,
],
// Redis서버에서 관리
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
'after_commit' => false,
],
],
// 작업을 실패했을 때, 작업의 에러를 저장하기 위한 설정
'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
];
설정을 한 queue를 기반으로 처리하는 작업은 job클래스를 통해서 정의해야 하며, Job 클래스는 app\Jobs 디렉토리에서 관리된다.
apps: