Переопределить время видимости для сообщения в очереди [ServiceStack]
Для длительных запросов на основе сообщений мы можем установить тайм-аут видимости на уровне очереди, но, похоже, нет способа переопределить его на уровне сообщений. Я хотел бы иметь возможность продлить время для длительных операций, не устанавливая слишком длинный тайм-аут для всей очереди. Базовая служба SQS предоставляет функцию ChangeMessageVisibility, но она не предоставляется. Из того, что я могу сказать, RedisMQ вообще не поддерживает эту концепцию.
- Есть ли время для RedisMQ?
- Можно ли выставить возможность продления времени видимости изнутри сервиса? Затем длительная операция может периодически вызывать ее, чтобы получить достаточно времени.
1 ответ
Redis MQ не имеет отношения к Amazon SQS или ServiceStack Amazon SQS MQ, за исключением того, что они представляют собой разные конкретные реализации API-интерфейсов обмена сообщениями ServiceStack, но ServiceStack AppHost может иметь только 1 IMessageService
зарегистрирован, так что я не понимаю, как использование Redis MQ имеет отношение к использованию Amazon SQS?
Redis MQ построен поверх примитивов Redis List и Pub/Sub и не содержит никаких таких настроек MQ.
Если вы просто ссылаетесь на Amazon SQS MQ, существует перегрузка RegisterHandler, которая позволяет вам указать visibilityTimeoutSeconds
для каждого типа сообщения, чтобы можно было выполнять долгосрочные запросы с другим типом запроса DTO, что было бы моей рекомендацией сохранять их изолированными. Auto Mapping ServiceStack позволяет легко преобразовывать запросы DTO с одной и той же схемой, например:
public object Any(MyRequest request) { ... }
public object Any(LongRunning request) => Any(request.ConvertTo<MyRequest>());
SqsMqServer
имеет RequestFilter
а также ResponseFilter
Вы можете использовать для проверки IMessage<T>
это возвращается ServiceStack MQ, который можно использовать для изменения метаданных, отправляемых в сообщении SQS, но не любых его пользовательских свойств уровня сообщения.
Чтобы включить детальный доступ к SQS, я добавил следующие фильтры в SqsMqServer
, SqsMqMessageFactory
а также SqsMqClient
в этом коммите, который позволит вам перехватывать и настраивать запросы, поступающие и поступающие из 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.