【问题标题】:How to remove particular messages in rabbitmq before publishing new messages?如何在发布新消息之前删除rabbitmq中的特定消息?
【发布时间】:2020-10-16 18:05:00
【问题描述】:

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

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

}
}

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

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

我已经浏览了一些帖子。

Post 1

Post 2

【问题讨论】:

  • 所以你有内容 id 为 M 的 msg1。你开始处理它,并在处理过程中内容 id 为 M 的 msg2 进入队列。在这种情况下你会怎么做?对这个问题的回答也是对你问题的回答。因此,您希望 RMQ 做的事情 - 消费者应该做的事情。

标签: javascript node.js rabbitmq message-queue amqp


【解决方案1】:

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

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

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

总体而言,recommendation 在使用 RabbitMQ 时在消息复制方面是为了使其消费幂等。换句话说,消费 2 条被认为相同的消息应该会导致相同的结果。

实现幂等性的一种方法是依靠二级缓存来存储消息标识符及其有效性。一旦消费者从 RabbitMQ 获取一条新消息,它会检查缓存以查看它是否是有效消息并采取相应措施。

【讨论】:

    【解决方案2】:

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

    只有不可变(不打算改变)的任务应该被放入一个工人应该消费的队列中。

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

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

    【讨论】:

    • 我正在使用微服务架构,一项服务将数据推送到队列,同时它可以推送相同 ID 的新数据。所以我想用相同ID的旧数据替换新数据。我不能为此目的使用 redis 或任何基于文档的数据库。
    【解决方案3】:

    我不确定删除消息是否是个好主意。如果您的要求是更新数据,以便始终为相同的 ID 维护最新数据。

    另一件事是,随着消息的消耗,最后的消息数据总是会得到更新。所以我在 Rabbit MQ 中没有看到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2018-07-26
      • 1970-01-01
      • 2013-09-05
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多