覆盖排队的消息的可见性时间[ServiceStack]

时间:2019-02-21 00:59:55

标签: servicestack amazon-sqs redismqserver

对于长时间运行的基于消息的请求,我们可以在队列级别设置可见性超时,但是似乎没有一种方法可以在消息级别覆盖它。我希望能够延长长时间运行的时间,而不仅仅是设置整个队列的超长超时。基础SQS服务提供ChangeMes​​sageVisibility函数,但未公开。据我所知,RedisMQ根本不支持该概念。

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

1 个答案:

答案 0 :(得分:1)

Redis MQ与Amazon SQS或ServiceStack的Amazon SQS MQ无关,只是它们是ServiceStack的Messaging APIs的不同具体实现,但ServiceStack AppHost只能注册1个IMessageService所以我不明白使用Redis MQ与您使用Amazon SQS有什么关系?

Redis MQ建立在Redis的List和Pub / Sub原语之上,并且不包含任何此类MQ定制。

如果您仅指的是Amazon SQS MQ,那么您可以使用RegisterHandler overload来为每种消息类型指定visibilityTimeoutSeconds,这样您就可以使用其他请求DTO类型执行长期运行的请求。我的建议是保持它们孤立。 ServiceStack的Auto Mapping使在具有相同架构的请求DTO之间进行转换变得容易,例如:

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

SqsMqServer确实具有RequestFilterResponseFilter,可用于检查ServiceStack MQ返回的IMessage<T>,可用于更改SQS中发送的元数据消息,但不是其任何自定义消息级别属性。

要启用对SQS的细粒度访问,我在this commit中的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(现在为available on MyGet)中获得。