Azure Servicebus 多个未知消费者
Azure Servicebus multiple unknown consumers
我需要创建一个队列,多个未知订阅者可以从中获取消息。
每个订阅者只能收到每条消息一次,并将消息标记为 complete/abandon 但仅限于他们自己。该消息将保留在其他订阅者的队列中。
阅读文档表明我需要创建一个主题,然后创建多个订阅。但是,由于架构原因。我无法提前指定订户将是什么。我希望新订阅者可以开始使用消息而无需更改我的队列配置。
azure servicebus 可以处理这种情况吗?此外,一些订阅者将使用其余客户端而不是 .net 客户端。
谢谢
不一定是这个问题的完整答案,但是可以让服务总线以这种方式工作,前提是你保持在 Azure 服务配额限制内。
客户端可以创建自己的订阅
string connectionString = CloudConfigurationManager.GetSetting("ServiceBus.ConnectionString");
// Note issue of how you secure this if necessary
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.SubscriptionExists(TOPIC_NAME, SUBSCRIPTION_NAME))
{
//var messagesFilter = new SqlFilter("you can add a client filter for the subscription");
SubscriptionDescription sd = new SubscriptionDescription(TOPIC_NAME, SUBSCRIPTION_NAME)
{
// configure settings or accept the defaults
DefaultMessageTimeToLive = TimeSpan.FromDays(14),
EnableDeadLetteringOnMessageExpiration = true,
MaxDeliveryCount = 1000,
LockDuration = TimeSpan.FromMinutes(3)
};
namespaceManager.CreateSubscription(sd);
// or namespaceManager.CreateSubscription(sd, messagesFilter);
}
// subscription client for the new topic
_subscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, TOPIC_NAME, SUBSCRIPTION_NAME, ReceiveMode.PeekLock);
Rest 中有一个等价物 api
https://msdn.microsoft.com/en-us/library/azure/hh780748.aspx
创建订阅后,客户端将能够接收从那时起发送到该主题的任何消息的副本。
你没有说有多少客户端,但你需要保持在服务总线服务限制范围内
https://azure.microsoft.com/en-us/documentation/articles/service-bus-quotas/
但是,您没有包含任何有关您的应用程序和客户性质的信息,并且可能有很多原因表明这不是一个可取的解决方案。包括
客户需要了解订阅安全密钥。
未协调的客户端将必须创建唯一的订阅名称。
客户可以在完成订阅后删除订阅,但您能确保发生这种情况吗?
根据配置,大量不活动的客户端可能会导致您的主题达到其配额限制并停止接受新消息。
……可能还有更多
如果客户不受您的控制,我会说这绝对不是正确的解决方案。
我需要创建一个队列,多个未知订阅者可以从中获取消息。
每个订阅者只能收到每条消息一次,并将消息标记为 complete/abandon 但仅限于他们自己。该消息将保留在其他订阅者的队列中。
阅读文档表明我需要创建一个主题,然后创建多个订阅。但是,由于架构原因。我无法提前指定订户将是什么。我希望新订阅者可以开始使用消息而无需更改我的队列配置。
azure servicebus 可以处理这种情况吗?此外,一些订阅者将使用其余客户端而不是 .net 客户端。
谢谢
不一定是这个问题的完整答案,但是可以让服务总线以这种方式工作,前提是你保持在 Azure 服务配额限制内。
客户端可以创建自己的订阅
string connectionString = CloudConfigurationManager.GetSetting("ServiceBus.ConnectionString");
// Note issue of how you secure this if necessary
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.SubscriptionExists(TOPIC_NAME, SUBSCRIPTION_NAME))
{
//var messagesFilter = new SqlFilter("you can add a client filter for the subscription");
SubscriptionDescription sd = new SubscriptionDescription(TOPIC_NAME, SUBSCRIPTION_NAME)
{
// configure settings or accept the defaults
DefaultMessageTimeToLive = TimeSpan.FromDays(14),
EnableDeadLetteringOnMessageExpiration = true,
MaxDeliveryCount = 1000,
LockDuration = TimeSpan.FromMinutes(3)
};
namespaceManager.CreateSubscription(sd);
// or namespaceManager.CreateSubscription(sd, messagesFilter);
}
// subscription client for the new topic
_subscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, TOPIC_NAME, SUBSCRIPTION_NAME, ReceiveMode.PeekLock);
Rest 中有一个等价物 api https://msdn.microsoft.com/en-us/library/azure/hh780748.aspx
创建订阅后,客户端将能够接收从那时起发送到该主题的任何消息的副本。
你没有说有多少客户端,但你需要保持在服务总线服务限制范围内 https://azure.microsoft.com/en-us/documentation/articles/service-bus-quotas/
但是,您没有包含任何有关您的应用程序和客户性质的信息,并且可能有很多原因表明这不是一个可取的解决方案。包括
客户需要了解订阅安全密钥。
未协调的客户端将必须创建唯一的订阅名称。
客户可以在完成订阅后删除订阅,但您能确保发生这种情况吗?
根据配置,大量不活动的客户端可能会导致您的主题达到其配额限制并停止接受新消息。
……可能还有更多
如果客户不受您的控制,我会说这绝对不是正确的解决方案。