【问题标题】:RabbitMQ scheduled message and revoke featureRabbitMQ 调度消息和撤销功能
【发布时间】:2020-12-07 06:09:48
【问题描述】:

是否可以使用 RabbitMQ 调度消息并在满足某些条件时删除消息(计划处理的消息)? 我们有一个要求,我们需要调用外部服务来获取一些数据。调用是异步的。客户端调用服务器的 API 端点,提及它需要的数据。服务器只是响应它已收到来自客户端的请求的确认。在内部,服务器也开始处理客户端请求,它会调用客户端 API 端点,并使用对有时从客户端返回的查询的实际响应。

在客户端需要等待从服务器获得响应之前,有一个时间限制(30 秒)。如果客户端在 30 秒内收到响应,那么它将继续执行。即使客户端在 30 秒内没有收到服务器的响应,也会继续执行其他步骤。

在客户端和服务器之间每秒发生数千个独立的事务(请求和响应)。客户端如何使用 RabbitMQ 以最有效的方式跟踪收到的请求和响应。 RabbitMQ 插件 rabbitmq_delayed_message_exchange 是否可以用于这种情况,在这种情况下,客户端将在队列中推送新消息以及 x-delay 标头(30 秒)?如果客户端在 30 秒之前收到来自服务器的响应,如何从队列中删除预定消息?

【问题讨论】:

  • 你控制客户端和服务器吗?
  • 服务器是一个外部服务,它会在一段时间后响应客户端的请求。服务器不受控制。只有发起请求并接受服务器响应的客户端在我们的控制范围内。

标签: rabbitmq message-queue rabbitmq-exchange


【解决方案1】:

我会做以下事情:

  1. 让响应也通过 RabbitMQ(使用 RPC
  2. 确保响应队列的名称也作为参数发送,用于通过某些交换策略(路由键或使用标头交换)对其进行路由
  3. 使用 2 的正确策略设置 DLX 交换。
  4. 在客户端->服务器队列中设置一个30s的TTL

这在通常情况下是如何工作的?

  1. 客户端创建回复队列
  2. 客户端向服务器发送请求
  3. 客户端从回复队列中消费
  4. 服务器使用消息并将响应发布到回复队列

超时会发生什么?

  1. 客户端创建回复队列
  2. 客户端向服务器发送请求
  3. 客户端从回复队列中消费
  4. 请求消息 TTL 触发器
  5. RMQ 将请求消息死信发送到回复队列
  6. 客户端收到自己的请求而不是响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2011-05-24
    • 2011-12-16
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2021-08-05
    • 2014-03-18
    相关资源
    最近更新 更多