์จ๋ผ์ธ ๊ฐ์
>PHP - ์ต์๊ธ
๐ PHP ์ต์๊ธ - 2์ฃผ์ฐจ: ๋ฉ์์ง ํ (Message Queue) ํ์ฉ - 03 PHP์์ ๋ฉ์์ง ํ ์ฐ๋ ๋ฐ ํ์ฉ (Laravel Queue ๋ฑ)
์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
- ๋ผ์ด์ ์ค: free
- ์ด์์ฒด์ :
- ํ์ผ ํฌ๊ธฐ: 0
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
- ๋ค์ด๋ก๋ ์: 1
- ์กฐํ์: 36
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
- ๋ฑ๋ก์ผ: 2025-10-07 09:01:37
- ์ค๋ช
์๋ ํ์ธ์. #PHP ์ต์๊ธ ๊ณผ์ 2์ฃผ์ฐจ์์๋ ๋ฉ์์ง ํ๋ฅผ #PHP ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ฐ๋ํ๊ณ ํ์ฉํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค. ํนํ, #PHP ์ํ๊ณ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ #Laravel ํ๋ ์์ํฌ์ #Queue ์์คํ ์ ์ค์ฌ์ผ๋ก ์ค์ต์ ๊ฐ๊น์ด ๋ด์ฉ์ ์์๋ณด๊ฒ ์ต๋๋ค.
PHP ๋ฉ์์ง ํ ์ฐ๋์ ์ดํด
์์ #PHP ํ๊ฒฝ์์ #๋ฉ์์ง ํ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, #RabbitMQ, #Redis, #Beanstalkd, #AWS SQS ๋ฑ ์ํ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ ํต์ ํ๊ธฐ ์ํ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ์ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๐ ๏ธ ์ฃผ์ ๋ฉ์์ง ๋ธ๋ก์ปค์ PHP ๋ผ์ด๋ธ๋ฌ๋ฆฌ
RabbitMQ: #AMQP(Advanced Message Queuing Protocol) ๊ธฐ๋ฐ์ ๊ฐ๋ ฅํ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก, #php-amqplib ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
Redis: ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์ฅ์์ด์ง๋ง, ๋ฆฌ์คํธ(List) ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋จํ #์์ ํ๋ก ๋ง์ด ํ์ฉ๋ฉ๋๋ค. #Predis๋ #phpredis ํ์ฅ์ ์ฌ์ฉํฉ๋๋ค.
Beanstalkd: ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ฉฐ, ์์ ์ 'Tube'์ ์ ์ฅํ๊ณ ์์ปค๊ฐ ๊ฐ์ ธ๊ฐ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ์ ์ฉ ์์ ํ์ ๋๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ก์ฐ๋ ๋ฒจ(Low-Level) ์ฐ๋์ ๋ณต์กํ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋กญ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง์ #PHP ํ๋ ์์ํฌ๋ #์ถ์ํ๋ #Queue ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Laravel Queue ์์คํ : ์ฐ๋ ๋ฐ ์ค์
#Laravel์ #Queue ์์คํ ์ ๋ค์ํ ๋ฐฑ์๋(๋ธ๋ก์ปค)๋ฅผ ์ผ๊ด๋ #API๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ์ถ์ํ ๊ณ์ธต์ ๋๋ค.
โ๏ธ ์ค์ (config/queue.php)
Laravel์ ํ ์ค์ ํ์ผ์์๋ ์ฌ๋ฌ #ํ ๋๋ผ์ด๋ฒ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
sync: ํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ ์ ์ฆ์ ์คํ (๊ฐ๋ฐ ๋ฐ ํ ์คํธ์ฉ).
database: ์์ ์ DB ํ ์ด๋ธ์ ์ ์ฅํ๊ณ , ์์ปค๊ฐ DB๋ฅผ ํด๋งํ์ฌ ๊ฐ์ ธ๊ฐ (๊ฐ๋จํ ํ๊ฒฝ์์ ์ ์ฉ).
redis: #Redis๋ฅผ ๋ฐฑ์๋๋ก ์ฌ์ฉ (๊ฐ์ฅ ๋น ๋ฅด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ต์ ์ค ํ๋).
rabbitmq/sqs/beanstalkd: ์ ์ฉ ๋ธ๋ก์ปค ๋๋ผ์ด๋ฒ (์ค์น ๋ฐ ์ค์ ํ์).
์์ (Redis ๋๋ผ์ด๋ฒ ์ค์ ):
PHP
'redis' => [
'driver' => 'redis',
'connection' => 'default', // Redis ์ฐ๊ฒฐ ์ค์ ์ด๋ฆ
'queue' => 'default', // ๊ธฐ๋ณธ ํ ์ด๋ฆ
'retry_after' => 90, // ์ฌ์๋๊น์ง ๋๊ธฐ ์๊ฐ (์ด)
'block_for' => 5, // ์์
์ด ์์ ๋ ์ต๋ ๋๊ธฐ ์๊ฐ (์ด)
],
๐งโ๐ป ์์ (Job) ์์ฑ ๋ฐ ๋์คํจ์น
#ํ์ ๋ฃ์ ์์
์ Job ํด๋์ค๋ก ์ ์ํฉ๋๋ค.
PHP
// app/Jobs/SendWelcomeEmail.php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
class SendWelcomeEmail implements ShouldQueue
{
use Dispatchable, Queueable;
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
// ์ค์ ์์
๋ก์ง์ ์ํํ๋ ๋ฉ์๋
public function handle()
{
// ์ด๋ฉ์ผ ๋ฐ์ก ๋ก์ง
Mail::to($this->user->email)->send(new WelcomeMail());
}
}
์์ ๋์คํจ์น: ์ปจํธ๋กค๋ฌ๋ ์๋น์ค์์ ์์ ์ ํ์ ๋ฃ์ต๋๋ค.
PHP
use AppJobsSendWelcomeEmail;
// ...
SendWelcomeEmail::dispatch($user);
// ๋๋
SendWelcomeEmail::dispatch($user)->onQueue('emails'); // ํน์ ํ ์ง์
์์ปค ํ๋ก์ธ์ค ์คํ ๋ฐ ๊ด๋ฆฌ
#Laravel์ #์์ปค ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋ํ์ฌ ํ์ ์์ธ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ ์์ปค ๊ตฌ๋
ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค๋ฅผ ์คํํฉ๋๋ค.
Bash
php artisan queue:work --tries=3 --timeout=60
queue:work: ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉฐ, ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ฒ๋ฆฌํ๊ณ ์ข ๋ฃํ์ง ์๊ณ ๋ค์ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.--tries=3: ์์ ์คํจ ์ ์ต๋ 3๋ฒ๊น์ง ์ฌ์๋ํฉ๋๋ค.--timeout=60: ์์ ์ด 60์ด๋ฅผ ์ด๊ณผํ๋ฉด ํ์์์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ญ ์์ปค ํ๋ก์ธ์ค ๊ด๋ฆฌ
์ค์ ์ด์ ํ๊ฒฝ์์๋ #PM2, #Supervisor ๋๋ #Laravel Horizon(Redis ๊ธฐ๋ฐ ํ ๊ด๋ฆฌ ๋๊ตฌ)์ ๊ฐ์ ํ๋ก์ธ์ค ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค ํ๋ก์ธ์ค๋ฅผ ์์ ์ ์ผ๋ก ์คํํ๊ณ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค.
Supervisor: ์์ปค ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ฑฐ๋ ์คํจํ์ ๋ ์๋์ผ๋ก ์ฌ์์ํ์ฌ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ์ง์์ผ ์ค๋๋ค.
Laravel Horizon: #Redis ํ ์ ์ฉ ๋์๋ณด๋๋ก, #ํ์ ์ํ, #์์ ์ฒ๋ฆฌ๋, #์คํจํ ์์ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
์์ ์คํจ ์ฒ๋ฆฌ์ ์ฌ์๋ (Retries)
๋น๋๊ธฐ ์์ ์ ๋คํธ์ํฌ ์ค๋ฅ, ์ธ๋ถ ์๋น์ค ์ฅ์ ๋ฑ ๋ค์ํ ์ด์ ๋ก ์คํจํ ์ ์์ต๋๋ค. ํ ์์คํ ์ ์ด๋ฌํ ์คํจ์ ๋์ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
๐๏ธ ์คํจํ ์์ (Failed Jobs)
์์ ์ด ์ต๋ ์ฌ์๋ ํ์๋ฅผ ์ด๊ณผํ์ฌ๋ ์คํจํ๋ฉด, ํด๋น ์์ ์ #์คํจํ ์์ (Failed Jobs) ํ ์ด๋ธ(๋๋ ๋ณ๋์ ์ ์ฅ์)๋ก ์ด๋ํฉ๋๋ค.
Bash
// ์คํจํ ์์
๋ชฉ๋ก ๋ณด๊ธฐ
php artisan queue:failed
// ์คํจํ ํน์ ์์
์ฌ์๋
php artisan queue:retry 123
๐ ๋ฐ๋ ๋ ํฐ ํ (Dead Letter Queue, DLQ)
๋ณด๋ค ์ ๋ฌธ์ ์ธ ๋ฉ์์ง ๋ธ๋ก์ปค(์: RabbitMQ, AWS SQS)๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ฌ์๋ ํ์๋ ์ฒ๋ฆฌ๋์ง ์์ ๋ฉ์์ง๋ฅผ ๋ณ๋๋ก ๊ฒฉ๋ฆฌํ๋ ๋ฐ๋ ๋ ํฐ ํ (DLQ) ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋์ค์ ์๋์ผ๋ก ๋ถ์ํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Laravel์ Queue ์์คํ ์ ์๋ฌํ๋ ๊ฒ์ #๋๊ท๋ชจ #PHP ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ํ๋ณดํ๋ ๋ฐ ํ์์ ์ธ ์ต์๊ธ ๊ธฐ์ ์ ๋๋ค.
๋ฌด๋ฃ์ฒดํ, ๋๊น์์ด ๋น ๋ฅธVPN VPN, ๊ตญ๋ด ๋ค๋IP, ๋ชจ๋ฐ์ผ๊ฐ๋ฅ, ๋ณธ์ฌ ํ์ง๊ด๋ฆฌ ์ ๋ขฐํ ์ ์๋ ๋ณด์์ฑ ๋์ VPN ์๋น์ค