2015-01-05 4 views
0

Я использую RabbitMq для отправки данных для зарегистрированных веб-крючков.RabbitMq: заменить дублированные сообщения

базы информация: Если контакт создается в системе, сообщение помещается в очереди и потребитель позже посылают данные крючков зарегистрированного URL.

На мой вопрос: Возможно, что контакт обновляется через 5 секунд в два раза и что оба сообщения все еще находятся в очереди. Но я бы хотел, чтобы второе сообщение было поставлено в очередь, что первое сообщение будет удалено.

Я знаю, что я не могу удалить сообщение вручную. Но возможно ли установить идентификатор в сообщении, и если два сообщения с одним и тем же идентификатором находятся в одной очереди, первый из них автоматически удаляется/заменяется? То, что на адрес отправляется только один запрос. Я знаю, что вы можете установить идентификатор сообщения в самом сообщении. Но я ничего не нашел, чтобы заменить старый.

Мой 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 я использую РНР amqplib https://github.com/videlalvaro/php-amqplib.

Спасибо за помощь Flo

ответ

1

RabbitMQ не удаляет/фильтровать сообщения таким образом. Вы должны сделать это на уровне приложения, возможно, используя что-то вроде фильтра цветения.

+0

Это то, что я думал. Но не уверен. Спасибо за помощь. – Flow

0

Вы можете пометить каждое сообщение уникальным идентификатором сообщения. Огнь приложение должно поддерживать оптимизированный список входящих сообщений идентификаторов, которые уже обработаны (в поточно-HashMap (Java) или Dictionary (.NET) реализации.

Если сообщение прибудет, что уже был обработан (идентификатор сообщения присутствует в сохраненном списке обработанных идентификаторов сообщений), он будет проигнорирован (или вежливый «пожалуйста, подождите», ответ типа должен быть выпущен), сохраняя идемпотентность.