Сервисная шина Azure - добавьте сообщение в очередь в отложенном состоянии
Мне интересно, возможно ли отправить сообщение с посредником в очередь / тему, где сообщение уже находится в отложенном состоянии?
Я спрашиваю об этом, потому что в настоящее время у меня есть процесс, который делает следующее...
- Процесс начинается, и посредническое сообщение отправляется в очередь (при этом запускается функция, которая записывает тело сообщения как сущность в хранилище таблиц со статусом "Обработка").
- Дополнительная работа сделана в процессе
- Если мы доберемся до конца процесса без каких-либо проблем, другое очередное сообщение отправляется в очередь с сообщением о завершении (это вызывает ту же функцию, которая обновляет сущность в хранилище таблиц со статусом "Завершено").
Хотя этот метод в основном работает, он кажется неуклюжим и хрупким. Мне бы очень хотелось иметь возможность отправить сообщение в очередь, а затем сделать последний шаг, чтобы сделать сообщение видимым в очереди, чтобы оно могло быть использовано функцией (Durable Function).
Я думал о настройке ScheduledEnqueueTimeUtc
, но я не могу гарантировать, когда процесс завершится (я думаю, здесь худший вариант), поэтому я не уверен, как долго его устанавливать.
Я также посмотрел на Defer
вариант для BrokeredMessage
но кажется, что это может быть установлено только от приемника и не может быть первоначально в отложенном состоянии.
Возможно ли то, что я пытаюсь сделать с помощью сообщений брокера Service Bus? Могу ли я установить время запланированной постановки в очередь на какое-то смехотворно долгое время (например, 2 часа), и если оно достигает этого времени, оно автоматически истекает и перемещается в очередь мертвых писем? Должен ли я отправить первоначальное сообщение в очередь "Мертвое письмо", а затем, как только процесс завершится, извлечь его и отправить повторно?
Кто-нибудь имел опыт реализации такого процесса... отправлять стартовое сообщение и обрабатывать его только после получения уведомления о завершении? Мне нужно, чтобы это было как можно более надежным, поскольку я имею дело с финансовыми операциями в этом процессе.
Надеюсь, мое объяснение имеет смысл.
2 ответа
Я решил эту проблему, сохранив процесс отправки двух сообщений, но реорганизовав свою долговременную функцию записи сообщений в Table Storage
проверьте, что оба сообщения были получены, и, если они есть, добавьте новое сообщение в Azure Queue Storage
, Вторая функция прослушивает очередь, которая начинает свой процесс.
После долгих испытаний это кажется довольно надежным решением. Тогда не имеет значения, в каком порядке поступают эти два сообщения или сколько времени они занимают... до тех пор, пока поступят оба сообщения, то есть когда сработает вторая функция.
Мне интересно, возможно ли отправить сообщение с посредником в очередь / тему, где сообщение уже находится в отложенном состоянии?
Это невозможно. Вы можете только отложить новое сообщение, но не отложить его. Откладывание требует, чтобы сообщение было получено первым, чтобы оно имело SequenceNumber
,
С помощью ScheduledEnqueueTimeUtc
имеет свои проблемы, так как вы будете отправлять его в будущем, но не можете отменить после завершения обработки. Вместо этого вы могли бы использовать QueueClient.ScheduleMessageAsync()
который возвращается SequenceNumber
немедленно. Таким образом, вы можете установить сообщение далеко в будущее, но также отменить его, если обработка была завершена ранее.