首页 > 解决方案 > 覆盖排队消息的可见性时间 [ServiceStack]

问题描述

对于长时间运行的基于消息的请求,我们可以在队列级别设置可见性超时,但似乎没有办法在消息级别覆盖它。我希望能够延长长时间运行的操作的时间,而无需设置队列范围的超长超时。底层 SQS 服务提供 ChangeMes​​sageVisibility 功能,但未公开。据我所知,RedisMQ 根本不支持这个概念。

  1. RedisMQ 是否存在有效的超时和重试?
  2. 是否有可能从服务中公开延长可见性时间的能力?然后,长时间运行的操作可以定期调用它以获得足够的时间。

标签: servicestackamazon-sqsredismqserver

解决方案


Redis MQ与 Amazon SQS 或 ServiceStack 的Amazon SQS MQ无关,只是它们是 ServiceStack消息 API的不同具体实现,但 ServiceStack AppHost 只能IMessageService注册 1 个,所以我不明白使用 Redis MQ 与您使用亚马逊 SQS?

Redis MQ 构建在 Redis 的 List 和 Pub/Sub 原语之上,不包含任何此类 MQ 自定义。

如果您只是指 Amazon SQS MQ,那么有一个RegisterHandler 重载,可让您指定visibilityTimeoutSeconds每条消息的类型,以便您可以使用不同的请求 DTO 类型执行长时间运行的请求,我建议您将它们隔离。ServiceStack 的Auto Mapping可以很容易地在具有相同模式的请求 DTO 之间进行转换,例如:

public object Any(MyRequest request) { ... }
public object Any(LongRunning request) => Any(request.ConvertTo<MyRequest>());

SqsMqServer确实有RequestFilter,您可以使用它ResponseFilter来检查IMessage<T>ServiceStack MQ 返回的,它可用于更改 SQS 消息中发送的元数据,但不能更改其任何自定义消息级属性。

为了启用对 SQS 的细粒度访问,我添加了以下过滤器SqsMqServerSqsMqMessageFactorySqsMqClient此提交中允许您拦截和自定义进出 Amazon SQS 的请求:

Action<SendMessageRequest,IMessage> SendMessageRequestFilter { get; set; }
Action<ReceiveMessageRequest> ReceiveMessageRequestFilter { get; set; }
Action<Amazon.SQS.Model.Message, IMessage> ReceiveMessageResponseFilter { get; set; }
Action<DeleteMessageRequest> DeleteMessageRequestFilter { get; set; }
Action<ChangeMessageVisibilityRequest> ChangeMessageVisibilityRequestFilter { get; set; }

此更改可从 v5.4.1 开始,现在可在 MyGet 上使用


推荐阅读