RabbitMq:替换重复的消息

RabbitMq: Replace duplicated messages

我正在使用 RabbitMq 为已注册的网络挂钩提交数据。

基地信息: 如果在系统中创建了一个联系人,消息将被放入队列中,消费者稍后将挂钩数据发送到已注册的 url。

关于我的问题: 有可能,联系人在 5 秒内更新两次,并且两条消息仍在队列中。 但我想,如果第二条消息排队,第一条消息将被删除。

我知道我无法手动删除邮件。但是是否可以在消息上设置一个 id,如果两个具有相同 id 的消息在同一个队列中,那么第一个自动为 removed/replaced? 只有一个请求被发送到 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();

顺便说一句,我正在使用 php amqplib https://github.com/videlalvaro/php-amqplib

感谢您的帮助 弗洛

RabbitMQ 不会 delete/filter 以这种方式发送消息。您必须在应用程序级别执行此操作,可能使用布隆过滤器之类的东西。

您可以使用唯一的消息 ID 标记每条消息。消费应用程序应保留已处理的入站消息 ID 的优化列表(在线程安全 HashMapJava)或 Dictionary (.NET) 实现。

如果已经处理过的消息到达(消息 ID 存在于存储的已处理消息 ID 列表中),它将被忽略(或者应该发出礼貌的“请稍候”式响应),保持幂等性。