2015-01-05 4 views
0

등록 된 웹 후크에 대한 데이터를 제출할 때 RabbitMq을 사용하고 있습니다.RabbitMq : 중복 메시지 대체

기본 정보 : 연락처가 시스템에서 생성되는 경우, 메시지가 큐에 배치되고, 소비자는 등록 된 URL로 나중에 훅 데이터를 전송한다.

내 질문에 : 연락처가 5 초에 두 번 업데이트되고 두 메시지가 모두 대기열에 남아있을 수 있습니다. 그러나 두 번째 메시지가 대기중인 경우 첫 번째 메시지가 제거됩니다.

나는 메시지를 수동으로 삭제할 수 없다는 것을 알고있다. 그러나 메시지에 ID를 설정하는 것이 가능하고 동일한 ID를 가진 두 개의 메시지가 같은 큐에 있으면 첫 번째 메시지가 자동으로 제거/대체됩니까? 하나의 요청 만 URL에 전송됩니다. 메시지 자체에 메시지 ID를 설정할 수 있다는 것을 알고 있습니다. 그러나 나는 옛것을 대체 할 아무것도 찾지 못했다.

내 PHP 코드 (간체) :

$connection = new AMQPConnection('localhost', 5672, 'test', 'test'); 
    $channel = $connection->channel(); 
    $channel->queue_declare(self::QUEUE_NAME, false, true, false, false); 

    $data = array(
     'model' => get_class($subject), 
     'id' => $subject->getId(), 
     'event' => $event->getName() 
    ); 
    $messageProperties = array(
     'message_id' => get_class($subject) . '-' . $subject->getId() 
    ); 
    $channel->basic_publish(new AMQPMessage(json_encode($data), $messageProperties), '', self::QUEUE_NAME); 

    $channel->close(); 
    $connection->close(); 

는 Btw은 내가 https://github.com/videlalvaro/php-amqplib amqplib하여 PHP를 사용하고 있습니다. 플로

답변

1

RabbitMQ 그런 식/필터 메시지를 삭제하지 않는 도움을

감사합니다. 아마도 블룸 필터 같은 것을 사용하여 앱 수준에서 그렇게해야합니다.

+0

그건 내가 생각한 것입니다. 그러나 확실하지 않았습니다. 도움을 주셔서 감사합니다. – Flow

0

잠재적으로 각 메시지에 고유 한 메시지 ID를 태그 할 수 있습니다. 스레드 안전 HashMap (자바), 또는 Dictionary (.NET) 구현 (이미 처리 한 인바운드 메시지 ID의 최적화 된 목록을 유지해야 소멸하는 응용 프로그램입니다.

메시지가 있다는 도착해야 (메시지 ID가 처리 된 메시지 ID의 저장된 목록에 있음) 이미 처리되었으므로 무시됩니다 (정중하게 "기다려주십시오"스타일 응답을 발행해야 함). idempotency는 그대로 유지됩니다 ..