PHP에서 RabbitMQ 메시지 사용 지연
RabbitMQ에서는 메시지 소비를 지연시킬 수 있습니다. 두 가지 방법이 있습니다. 첫 번째는 RabbitMQ 버전 3.5.3부터 사용할 수 있는 추가 플러그인을 설치해야 합니다. 두 번째는 일종의 해결 방법이며 추가 도구가 필요하지 않습니다.
RabbitMQ 지연 메시지 플러그인
플러그인은 새로운 교환 유형을 추가합니다:
x-delayed-message
. 밀리초 단위의 값이 있는 x-delay
헤더와 함께 메시지를 보냅니다. 이 시간이 지나면 메시지가 대기열에 나타납니다.교환을 선언할 때 원래 교환의 유형과 함께
x-delayed-type
헤더를 전달합니다. 직접 또는 주제. 이 인수는 필수입니다.전송된 메시지는 Mnesia라는 특수 데이터베이스에 저장됩니다. 현재 노드의 단일 디스크 복제본에 저장됩니다. 이 경우 RAM 노드는 지원되지 않습니다.
장점:
단점:
예시:
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
$channel->queue_declare(
queue: 'example_queue',
durable: true,
auto_delete: false
);
$channel->exchange_declare(
exchange: 'example_exchange',
type: 'x-delayed-message',
durable: true,
auto_delete: false,
arguments: new AMQPTable(
[
'x-delayed-type' => 'direct'
]
)
);
$channel->queue_bind('example_queue', 'example_exchange');
$message = new AMQPMessage('test', [
'application_headers' => new AMQPTable(['x-delay' => 10000])
]);
$channel->basic_publish($message, 'example_exchange');
배달 못한 편지 대기열
이 솔루션은 모든 버전의 RabbitMQ에서 사용할 수 있습니다. 두 개의 대기열을 만들려고 합니다.
첫 번째는 세 가지 매개변수로 생성됩니다.
우리는 이 대기열에 메시지를 게시하지만 메시지를 소비하지는 않습니다.
매개변수
x-message-ttl
는 메시지가 해당 대기열에 보관되는 시간(밀리초)을 정의합니다. 그 시간이 지나면 메시지는 x-dead-letter-exchange
인수에 선언된 교환으로 이동되고 라우팅은 x-dead-letter-routing-key
에 선언됩니다.결과적으로 첫 번째 대기열에서 종료된 모든 메시지는 두 번째 대기열로 전달됩니다.
장점:
단점:
예시:
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
$channel->queue_declare(
queue: 'destination_queue',
durable: true,
auto_delete: false
);
$channel->queue_declare(
queue: 'delay_queue',
durable: true,
auto_delete: false,
arguments: new AMQPTable(
[
'x-dead-letter-exchange' => 'delayed_exchange',
'x-dead-letter-routing-key' => 'destination_queue',
'x-message-ttl' => 10000
]
)
);
$channel->exchange_declare(
exchange: 'delayed_exchange',
type: AMQPExchangeType::DIRECT,
durable: true,
auto_delete: false
);
$channel->queue_bind('delay_queue', 'delayed_exchange', 'delay_queue');
$channel->queue_bind('destination_queue', 'delayed_exchange', 'destination_queue');
$message = new AMQPMessage('test');
$channel->basic_publish($message, 'delayed_exchange', 'delay_queue');
요약
두 솔루션 모두 사용하기 쉽습니다. 장점과 단점이 있습니다. 첫 번째 솔루션을 선택하면 전용 교환이 이루어집니다. 그러나 실제로 프로덕션 용도로 상당히 안정적인 추가 플러그인을 설치해야 합니다.
두 번째 솔루션은 네이티브입니다. 그러나 추가 대기열을 생성해야 하므로 첫 번째 대기열만큼 투명하지 않습니다. 그러나 더 빠릅니다.
Reference
이 문제에 관하여(PHP에서 RabbitMQ 메시지 사용 지연), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jszutkowski/2-ways-of-delaying-message-consumption-in-rabbitmq-336e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)