Azure Service Bus中的Topic DefaultMessageTimeToLive和Subscription DefaultMessageTimeToLive之间的区别

6

在Azure Service Bus上,主题(Topic)和相关的订阅(Subscription)都有一个暴露DefaultMessageTimeToLive属性;初始化如下:

if (!NamespaceManager.TopicExists(TopicName))
{
    NamespaceManager.CreateTopic(
        new TopicDescription(TopicName)
            {
                MaxSizeInMegabytes = 5120,
                DefaultMessageTimeToLive = TimeSpan.FromDays(14)
            });
}

if (!NamespaceManager.SubscriptionExists(TopicName, SubscriptionName))
{
    NamespaceManager.CreateSubscription(
        new SubscriptionDescription(TopicName, SubscriptionName)
            {
                LockDuration = TimeSpan.FromMinutes(5),
                DefaultMessageTimeToLive = TimeSpan.FromDays(7),
                EnableDeadLetteringOnMessageExpiration = true
            });
}

两者有何区别,为什么要有两个 TTL 设置? 此外,如果在主题上的消息过期了,会发生什么?
1个回答

7
主题的TTL适用于其所有订阅。如果需要,订阅可以有自己的TTL,但应小于主题TTL。应用于订阅的TTL适用于发送到其中的所有消息,并且消息可以具有自己的TTL,这应再次小于订阅TTL。 如果消息过期并且在订阅上启用了DeadLettering,则过期消息将移动到DeadLetter队列,否则将永久删除。
更多信息请参考此处:http://msdn.microsoft.com/en-us/library/windowsazure/hh780749.aspx

谢谢您的回复Dhana;但是我知道在主题上您无法设置EnableDeadLetteringOnMessageExpiration,这只能在订阅上设置。这引出了一个问题:为什么主题需要TTL呢? - Luke Merrett
2
通过阅读此文档(http://msdn.microsoft.com/en-us/library/windowsazure/hh780749.aspx),我得出的结论是它是一种方便的选项,可以在主题上设置TTL,因为您不必在每个订阅上设置它,并且过期的消息似乎会进入订阅的死信。虽然我还没有尝试过。 - Dhana Krishnasamy
1
订阅会继承主题的TTL,除非它们明确使用较小的TTL创建。根据死信功能是否启用,TTL已过期的消息将被移动到订阅关联的DeadLetterQueue或永久删除。 - Luke Merrett
更新答案,这样其他人也可以受益。 - Dhana Krishnasamy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接