Автоматически истекшая потерянная подписка (Azure ServiceBus Messaging SubscriptionClient)

Я имею в виду следующий сценарий: служебная шина используется для связи между экземплярами, поэтому подписка уникальна для каждого экземпляра службы. Конечный результат заключается в том, что, если экземпляр не закрывается изящно, его подписка не удаляется.

Когда экземпляр службы "умирает" и перезапускается, предыдущее содержимое подписки не имеет значения и может быть отброшено.

Итак, есть ли способ установить "время жизни" для подписки на служебную шину или смоделировать что-то подобное, не прибегая к какому-то пользовательскому механизму обнаружения сирот?

3 ответа

Решение

Эта конкретная функция находится в резерве для одного из следующих выпусков. Тем не менее, в Azure вы можете использовать идентификатор экземпляра среды ролей для создания имени вашей подписки и, таким образом, для перезапускающего экземпляра повторно использовать подписку. Имена экземпляра стабильны.

Изменить: функция AutoDeleteOnIdle https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.subscriptiondescription

Начиная с Azure SDK 2.0, это работает как ожидалось.

Кроме того, в отличие от других отчетов, в моем тестировании подписка не удалялась, пока есть ожидающий получатель, прослушивающий эту подписку.

var description = new SubscriptionDescription(topicPath, subscriptionId);
description.AutoDeleteOnIdle = TimeSpan.FromSeconds(600);
namespaceManager.CreateSubscription(description);

У меня была точно такая же проблема, предварительное решение было выпущено в начале 2013 года: http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.subscriptiondescription.autodeleteonidle.aspx

Это очень легко использовать (см. Пример ниже). К сожалению, кажется, что срок действия подписки истекает, если в течение периода AutoDeleteOnIdle не публикуется сообщение, даже если у вас есть какой-то процесс, ожидающий сообщений (согласно Azure Servicebus AutoDeleteOnIdle).

NamespaceManager manager=NamespaceManager.CreateFromConnectionString(serviceBusConnectionString);
if(!manager.SubscriptionExists(topic,subscriptionName))
{
    manager.CreateSubscription(new SubscriptionDescription(topic,subscriptionName) {
        AutoDeleteOnIdle=TimeSpan.FromDays(2)
    });
}
Другие вопросы по тегам