Я использую 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.
Спасибо за помощь
Фло
RabbitMQ не удаляет и не фильтрует сообщения таким образом. Вы должны сделать это на уровне приложения, возможно, используя что-то вроде фильтра Блума.
Вы можете пометить каждое сообщение уникальным идентификатором сообщения. Приложение-потребитель должно хранить оптимизированный список идентификаторов входящих сообщений, которые оно уже обработало (в поточно-ориентированном режиме). HashMap
(Джава), или же Dictionary
(.СЕТЬ) реализация.
Если поступит сообщение, которое уже было обработано (идентификатор сообщения присутствует в сохраненном списке идентификаторов обработанных сообщений), оно будет проигнорировано (или должен быть выдан вежливый ответ в стиле «пожалуйста, подождите»), сохраняя идемпотентность.