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 的优化列表(在线程安全 HashMap
(Java)或 Dictionary
(.NET) 实现。
如果已经处理过的消息到达(消息 ID 存在于存储的已处理消息 ID 列表中),它将被忽略(或者应该发出礼貌的“请稍候”式响应),保持幂等性。
我正在使用 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 的优化列表(在线程安全 HashMap
(Java)或 Dictionary
(.NET) 实现。
如果已经处理过的消息到达(消息 ID 存在于存储的已处理消息 ID 列表中),它将被忽略(或者应该发出礼貌的“请稍候”式响应),保持幂等性。