RabbitMq:替换重复的消息

时间:2015-01-05 16:58:29

标签: php rabbitmq amqp php-amqplib

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

基本信息: 如果在系统中创建了联系人,则将消息放入队列中,并且消费者稍后将挂钩数据发送到已注册的URL。

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

我知道我无法手动删除邮件。但是在某种程度上可以在消息上设置一个id,如果两个具有相同id的消息在同一个队列中,那么第一个消息会被自动删除/替换吗? 只有一个请求被发送到网址。我知道您可以在消息self上设置消息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

感谢您的帮助 FLO

2 个答案:

答案 0 :(得分:1)

RabbitMQ不会以这种方式删除/过滤消息。你必须在应用程序级别这样做,可能使用类似布隆过滤器的东西。

答案 1 :(得分:0)

您可以使用唯一的消息ID标记每封邮件。消费者应用程序应保留已经处理的入站消息ID的优化列表(在线程安全的HashMap Java )或Dictionary。 NET )实施。

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