개발
라라벨 큐 기능 적용해보기
최근에 백단에서 비동기로 처리할 일이 있어서 이리저리 알아보다가 라라벨에선 이럴때 큐 기능을 사용하면 된다고 정보를 얻게되었다.
큐 기능자체가 있던건 알고있었는데, 제대로 써본적이없어서 이번기회에 한번 알아보았다.
라라벨 큐(Queue)
큐는 우리가 운영체제나 프로세스 구조를 배우면서 배우는 그 '큐'가 맞다.
먼저 들어간놈이 먼저 나오는 FIFO 형식의 프로세스 처리구조를 가지고있어 예약 대기 작업을 처리하는데 자주 이용이된다.
라라벨도 기본적으론 큐를 지원하는데 기본 큐 드라이버가
sync
로 설정되어있다.즉 메모리상에서 즉시 실행되는 방식으로 사실상 프로세스 내부에서 동기처리로 작업되는 경우라 상상하는 그런 큐로써의 동작은 하지 않는다.
실제로 비동기 처리로 프로세스와 별개로 큐를 처리하려면 큐 드라이버를 database 로 변경해주고 큐가 들여다볼
job
테이블을 구현해놓아야한다.당연히 관련 코드는 라라벨에서 제공하므로 아래와 같은 순서로 쉽게 큐 드라이버 환경을 구성해볼 수 있다.
1. env 파일 설정 변경
라라벨의 여러 환경설정값을 세팅하는 .env 파일을 열어 큐 드라이버를 아래와 같이 바꿔준다.
QUEUE_CONNECTION=database
Copy
그리고 이 env 설정이 라라벨 프로젝트에 적용되도록 터미널(CLI)로 들어가 라라벨 프로젝트에서 아래 명령어를 통해 설정값을 적용해준다.
php artisan config:cache
Copy
2. 큐용 job 테이블 생성
그리고 큐테이블을 생성해야하는데, 관련 생성 청사진은 라라벨 패키지에서 지원하므로 이를 꺼내와서 마이그레이션 작업을 진행해준다.
php artisan queue:table
php artisan migrate
Copy
3. 큐 워커 실행
이후 큐가 job 테이블을 감시하면서 작업을 수행시키려면 터미널에서 아래와 같은 명령어로 워커를 실행시키면 된다.
php artisan queue:work
Copy
이 워커는 터미널이 열려있는 상태에서 감시&작업대기상태로 계속 유지되며 터미널을 종료하면 워커도 같이 종료가 된다.
이를 라이브 서버에서 상시로 적용하고 싶으면 우분투(리눅스)의 경우에는 슈퍼바이저라는 패키지를 통해 워커를 실행시킬 수 있다.
슈퍼바이저(Supvervisor) 설치
sudo apt update
sudo apt install supervisor
Copy
우분투의경우 apt로 쉽게 슈퍼바이저를 설치할 수 있다.
설치가 완료된이후 아래 명령어를 통해 슈퍼바이저에서 사용할 설정파일을 생성해주자.
sudo nano /etc/supervisor/conf.d/laravel-queue.conf
Copy
[program:laravel-queue]
process_name=%(program_name)s
command=php /var/www/web/artisan queue:work --sleep=3 --tries=3 --timeout=90
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/laravel-queue.log
Copy
user=www-data
는 우분투에서 해당 프로세스를 실행시키는 주체를 뜻하는것이므로 일반적으로 웹서버 권한으로 실행시키므로 www-data
로 작성해두는것이 좋다.필요에 따라 현재 접속계정명으로 바꿔도 되는데, 이러면 관련 파일의 권한설정도 더불어 해줘야할것이다.
슈퍼바이저의 실행로그는 stdout_logfile의 경로에 저장된다.
필요에 따라 바꿔주면될것이다. (가끔 저 로그파일이 과도한 권한 root:www-data로 생성될때가 있는데, chmod 777, chown www-data:www-data로 로그파일의 권한을 변경해주면 실행기록이 잘 남게된다.)
이후 슈퍼바이저를 아래와 같이 시작해주고 실행여부를 확인해볼 수 있다.
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-queue
sudo supervisorctl status
laravel-queue RUNNING pid 1234, uptime 0:01:23 #실행결과
Copy
큐 실행 테스트
위의 방식대로 큐 드라이버를 설정하면 이를 테스트해보는 일만 남았다.
php artisan make:job TestQueueJob
Copy
위 명령어로 테스트용 큐잡을 하나 생성해준다.
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class TestQueueJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Log::info('TestQueueJob 실행됨!');
}
}
Copy
그리고 라라벨 로그로 기록을 남기는 job을 구현해둔다.
이 작업을 실행시키기위해 터미널로 이동한 후 라라벨 프로젝트에 경로를 두고 tinker를 실행시킨다.
php artisan tinker
>>> dispatch(new \App\Jobs\TestQueueJob());
Copy
그리고 위와같이 dispatch 메소드로 해당 작업을 실행시켜준다.
그러면 라라벨 로그 파일에 아래와 같이 로그가 찍히면 제대로 큐가 작동하는것임을 확인할 수 있다.
[2025-05-09 12:29:43] production.INFO: TestQueueJob 실행됨!
Copy
이와 더불어 큐 로그에도 아래와 같이 실행 여부가 찍혀나오게된다.
[2025-05-09 12:25:06][1] Processing: App\Jobs\TestQueueJob
[2025-05-09 12:25:06][1] Processed: App\Jobs\TestQueueJob
[2025-05-09 12:25:51][2] Processing: App\Jobs\TestQueueJob
[2025-05-09 12:25:51][2] Processed: App\Jobs\TestQueueJob
[2025-05-09 12:26:21][3] Processing: App\Jobs\TestQueueJob
[2025-05-09 12:26:21][3] Processed: App\Jobs\TestQueueJob
[2025-05-09 12:27:00][4] Processing: App\Jobs\TestQueueJob
[2025-05-09 12:27:00][4] Processed: App\Jobs\TestQueueJob
[2025-05-09 12:27:15][6] Processing: App\Jobs\TestQueueJob
[2025-05-09 12:27:15][6] Processed: App\Jobs\TestQueueJob
[2025-05-09 12:29:43][7] Processing: App\Jobs\TestQueueJob
[2025-05-09 12:29:43][7] Processed: App\Jobs\TestQueueJob
Copy
#Laravel #Ubuntu
0
개의 댓글
개발 카테고리의 다른 글

05/08
HTTP 500번대 에러 정리 및 해결 방안
지난 글에 이어서 이번에는 서버단에서 발생하는 문제에 대한 에러코드에 대해 알아보고자 한다.사실 400번대 에러는 클라이언트의 잘못된 요청이 대부분이므로 적당히 에러코드와 함께 메시지를 보여줘 UX를 충족시키면되지만, 500번대는 실제로 서버에서 백단작업중에 의도치 않게 발생하는 문제이므로 유저가 보는 경우...

05/08
HTTP 400번대 에러 정리 및 추천 메시지
최근에 백단 컨트롤러에서 잘못된 요청에 따른 예외처리를 할일이 있어서 400번대 에러코드에 대해 알아보다가 한번 정리가 필요할듯 싶어서 관련내용을 조사해보고 정리해보았다. 일반적으로 HTTP 400번대 에러는 '클라이언트의 잘못된 요청'으로 인해 서버가 정상적인 응답을 할 수 없을때 나타내는 에러코드이다.유명한...
04/30
brew로 설치한 mysql 8버전 실행 문제 (해결실패...)
가끔 로컬에서 디비작업할 일이 있어서 로컬에 mysql을 깔아두고 필요할때만 쓰고있었다.근데 최근에 다시 쓸일이 있어 mysql을 작동하려는데 아래와 같은 메시지가 뜨며 제대로 실행되지 않았다. 뭔소린가 싶어서 지피티한테 물어봤더니 모종의 brew 작업중 plist가 깨지거나 mysql 자체의 오류가 있어서 발생하는 문제라...