Автоматически истекшая потерянная подписка (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)
});
}