RabbitMq: заменить дублирующиеся сообщения

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

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

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

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

Мой код 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();

Кстати, я использую php amqplib https://github.com/videlalvaro/php-amqplib.

Спасибо за помощь
Фло

1

Решение

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

1

Другие решения

Вы можете пометить каждое сообщение уникальным идентификатором сообщения. Приложение-потребитель должно хранить оптимизированный список идентификаторов входящих сообщений, которые оно уже обработало (в поточно-ориентированном режиме). HashMap (Джава), или же Dictionary (.СЕТЬ) реализация.

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

0