我正在尝试使用Azure Service Bus将Web角色的消息广播到单个辅助角色的所有实例。这是我用来接收消息的代码:
// Create the topic if it does not exist already
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
// Configure Topic Settings
TopicDescription td = new TopicDescription("CommandTopic");
td.MaxSizeInMegabytes = 5120;
td.DefaultMessageTimeToLive = new TimeSpan(0, 0, 1);
if (!namespaceManager.TopicExists("CommandTopic"))
{
namespaceManager.CreateTopic(td);
}
Random rand = new Random();
double randNum = rand.Next();
if (!namespaceManager.SubscriptionExists("CommandTopic", "CommandSubscription"+randNum))
{
namespaceManager.CreateSubscription("CommandTopic", "CommandSubscription" + randNum);
}
Client = SubscriptionClient.CreateFromConnectionString(connectionString, "CommandTopic", "CommandSubscription" + randNum, ReceiveMode.ReceiveAndDelete);
Trace.WriteLine("SUBSCRIPTION: COMMANDSUBSCRIPTION"+randNum);
为了为每个辅助角色实例创建单独的订阅(以便所有实例都在主题中接收消息),我必须使用随机数。有没有办法使用实例的一些Id而不是随机数。有Instance.Id但是它太长,不能用作订阅名称的参数。没有使用子字符串是否有更短的版本?另外,是为每个实例创建一个单独的订阅方法吗?以前所有实例都订阅了相同的订阅,因此只有1个实例收到消息并从订阅中删除它。
答案 0 :(得分:0)
尝试为您的配置添加一个伪角色InternalEndpoint for worker角色。这样可以确保填充角色实例列表。
答案 1 :(得分:0)
请找到以下链接,我希望它可以帮助您实现角色之间的相互沟通:
http://msdn.microsoft.com/en-us/library/windowsazure/hh180158.aspx
还请看看以下链接,我认为它正是您正在寻找的内容: http://windowsazurecat.com/2011/08/how-to-simplify-scale-inter-role-communication-using-windows-azure-service-bus/
我认为您所谈论的内容将类似于以下链接中的方案4,其中角色可以与其他几个角色进行通信。我不确定您要求的是否可行,但尝试使用服务总线队列的Windows Azure辅助角色,我认为这可能对您有很大帮助,并且在这种情况下也可能是比主题和订阅更好的解决方案。