Stomp 큐

Stomp는 간단한(스트림) 텍스트 지향 메시지 프로토콜로, STOMP 클라이언트가 임의의 STOMP 메시지 브로커(Broker)와 상호작용할 수 있도록 허용하는 상호 운용 가능한 연결 형식을 제공합니다. workerman/stomp에서 Stomp 클라이언트를 구현하였으며, 주로 RabbitMQ, Apollo, ActiveMQ 등의 메시지 큐 시나리오에서 사용됩니다.

설치

composer require webman/stomp

구성

구성 파일은 config/plugin/webman/stomp 경로에 있습니다.

메시지 전송

<?php
namespace app\controller;

use support\Request;
use Webman\Stomp\Client;

class Index
{
    public function queue(Request $request)
    {
        // 큐
        $queue = 'examples';
        // 데이터(배열을 전달할 경우 자체적으로 직렬화해야 합니다. 예: json_encode, serialize 등 사용)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // 전송 실행
        Client::send($queue, $data);

        return response('redis queue test');
    }

}

다른 프로젝트와의 호환성을 위해 Stomp 컴포넌트는 자동 직렬화 및 역직렬화 기능을 제공하지 않습니다. 배열 데이터를 전송하는 경우에는 직접 직렬화해야 하며, 소비할 때도 직접 역직렬화해야 합니다.

메시지 소비

app/queue/stomp/MyMailSend.php 파일을 새로 만듭니다(클래스 이름은 임의로 지정 가능하며, psr4 규격에 맞아야 합니다).

<?php
namespace app\queue\stomp;

use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;

class MyMailSend implements Consumer
{
    // 큐 이름
    public $queue = 'examples';

    // 연결 이름, stomp.php의 연결에 해당
    public $connection = 'default';

    // 값이 client일 경우, $ack_resolver->ack()를 호출하여 서버에 성공적으로 소비되었음을 알려야 함
    // 값이 auto일 경우 $ack_resolver->ack()을 호출할 필요 없음
    public $ack = 'auto';

    // 소비
    public function consume($data, AckResolver $ack_resolver = null)
    {
        // 데이터가 배열인 경우, 직접 역직렬화해야 함
        var_export(json_decode($data, true)); // 출력 ['to' => 'tom@gmail.com', 'content' => 'hello']
        // 서버에 성공적으로 소비되었음을 알림
        $ack_resolver->ack(); // ack가 auto일 경우 이 호출을 생략 가능
    }
}

rabbitmq에서 stomp 프로토콜 활성화

rabbitmq는 기본적으로 stomp 프로토콜이 활성화되어 있지 않으므로, 다음 명령어를 실행하여 활성화해야 합니다.

rabbitmq-plugins enable rabbitmq_stomp

활성화 후 stomp의 기본 포트는 61613입니다.