如何在发布新消息之前删除rabbitmq中的特定消息?

Tec*_*ain 6 javascript message-queue amqp rabbitmq node.js

我有一个订阅者将数据推送到队列中。现在消息看起来像这样

{
 "Content": {
   "_id" ""5ceya67bbsbag3",
   "dataset": { 
     "upper": {},
      "lower": {}

}
}
Run Code Online (Sandbox Code Playgroud)

现在可以使用相同的内容 id 推送新消息,但数据将不同。因此,我想删除具有相同 id 的旧消息或替换那些 id 相同的消息并仅保留最新消息。

我还没有在rabbitmq 中找到直接的解决方案。请指导我如何做到这一点?

我已经浏览了一些帖子。

发布 1

帖子 2

nox*_*fox 5

您想要实现的目标无法通过 RabbitMQ(或更确切地说 AMQP 协议)轻松解决。

RabbitMQ 队列是简单的FIFO堆栈,除了在顶部发布和从底部消费之外,不提供任何访问元素的方法。

因此,在不依赖其他服务的情况下“更新”现有消息的唯一方法是获取所有消息,直到找到您感兴趣的消息,丢弃它,然后将新消息与您获取的其他消​​息一起发布与它一起。

总的来说,在使用 RabbitMQ 进行消息复制时,建议使其消费幂等。换句话说,消费两条被认为相同的消息应该会导致相同的结果。

实现幂等性的一种方法是依赖辅助缓存,在其中存储消息标识符及其有效性。一旦消费者从 RabbitMQ 获取新消息,它就会检查缓存以查看它是否是有效消息并采取相应的操作。


小智 0

我认为这是一种稍微错误的使用rabbitMQ的方式。

只有不可变(不打算更改)的任务才应放入工作人员应使用的队列中。

实现特定任务的另一种方法是

  • 只需将不可变数据推入队列 { "content" : { "_id" : "5ceya67bbsbag3"} .. }
  • 将可变数据存储在数据库(mongo)或内存数据库中(这里建议使用类似redis的东西)。
  • 每当需要更新时,在数据库中更新
  • 让您的工作人员使用数据库中的“_id”引用获取所需的数据