대기열이 있는 Laravel 알림 시스템

3917 단어
왜 라라벨 큐인가?

이전 게시물에서 설명했듯이 알림을 사용하여 실패한 알림이 전달되지 않도록 대기열 시스템도 구현하는 것이 좋습니다.
대기열 알림을 처음 읽는 것은 구현하기가 복잡해 보이지만 그렇게 어렵지는 않습니다.
이 튜토리얼을 통해 가능한 한 쉽게 할 수 있도록 도와드리겠습니다.

시작하자
Queue를 사용하려면 laravel 명령으로 테이블 작업을 마이그레이션해야 합니다.

php artisan queue:table

php artisan migrate


그런 다음 데이터베이스로 .ENV 파일을 설정하십시오.

QUEUE_CONNECTION=database


이제 알림 예제를 만들고 인터페이스 및 특성을 구현하는 방법을 살펴보겠습니다.

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\BroadcastMessage;

class RealTimeNotification extends Notification implements ShouldBroadcast
{
    use Queueable;

    public string $message;

    public function __construct(string $message)
    {
        $this->message = $message;
    }

    public function via($notifiable): array
    {
        return ['broadcast'];
    }

    public function toBroadcast($notifiable): BroadcastMessage
    {
        return new BroadcastMessage([
            'message' => "$this->message"
        ]);
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            'message' => "$this->message",
        ];
    }
}



toArray 메소드를 사용하면 대기열에 저장하기 위해 알림을 형식화하는 방법을 지정할 수 있습니다. 또한 이 방법은 알림 데이터베이스 테이블에 알림을 저장하는 데 사용됩니다(웹소켓을 사용한 알림 시스템 게시물에서 이 기능을 이미 설명했습니다).

알림 클래스에 "ShouldBroadcast"인터페이스와 "Queueable"특성을 추가하면 자동으로 작업 테이블에 모든 알림을 보낼 수 있으며 알림이 실패할 경우 영원히 잃지 않고 계속 관리할 수 있습니다. 하기 위해서.

장인 대기열: 작업
지금부터 데이터베이스 작업에 두 개의 테이블이 있고 fail_jobs 테이블이 있습니다. 알림을 트리거하면 작업 테이블에서 먼저 전달되고 대기열에서 관리됩니다. 이 중 하나가 실패하면 길을 잃지 않도록 failed_jobs 테이블로 이동됩니다.

이 모든 프로세스를 관리하려면 artisan 명령을 시작해야 합니다.

php artisan queue:work


이 명령 후에 최대로 설정할 여러 구성을 지정할 수 있지만 이를 위해 laravel 문서를 살펴보는 것이 좋습니다.
laravel-queue-doc

artisan queue:work는 알림을 하나씩 받고 필요에 따라 보냅니다.
여기에 구성의 예가 있습니다.

php artisan queue:work --sleep=3 --tries=3 --backoff=3 --max-time=3600 --max-jobs=5 --stop-when-empty****


보시다시피 저는 예를 들어 --tries 3을 설정했습니다. 이런 식으로 시스템이 실패하고 failed_jobs 테이블로 이동하기 전에 알림 전송을 3번 시도하도록 할 수 있습니다.

때로는 초과된 작업자 시간 초과와 같은 다양한 원인으로 인해 작업이 실패할 수 있습니다. 이 경우 다른 시간에 작업을 관리할 수 있으며 명령을 실행하기만 하면 됩니다.

php artisan queue:retry 


이런 식으로 작업을 작업 테이블로 되돌리고 queue:work를 두 번째로 재처리하고 두 번째 기회를 제공합니다.

!주의: 이 모든 프로세스는 이 튜토리얼에서 수동으로 실행되지만 서버에서 관리해야 합니다. 감독자를 설치하고 문서에 laravel이 제공하는 구성을 추가하는 것이 좋습니다.
supervisor configuration

관리자를 설치하는 것은 그리 어렵지 않으며 그 후에 이와 같은 일부 설정을 추가할 Supervisor.conf 파일이 생깁니다.

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --backoff=3 --max-time=3600 --max-jobs=5 --stop-when-empty
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
startretries=3
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
stderr_logfile=/var/www/html/storage/logs/worker-error.log
stopwaitsecs=3600


이 튜토리얼이 도움이 되기를 바라지만 내가 놓친 것이 있거나 리팩터링할 아이디어가 있으면 으로 연락해 주십시오.

좋은 웹페이지 즐겨찾기