从具有辅助角色

时间:2015-06-16 11:49:13

标签: c# multithreading azure azure-worker-roles

我试图解决在Azure Service Bus上创建多个队列(即每月一个队列)的问题。队列中的消息包含有关客户账单的信息。队列的创建方式如下:

/// <summary>
/// Creates a new queue on Azure Service Bus
/// </summary>
/// <param name="queueName">string</param>
/// <returns>string (name of created queue)</returns>
public string CreateNewQueue(string queueName)
{
    try
    {
        NamespaceManager manager = NamespaceManager.Create();

        if (!manager.QueueExists(queueName))
        {
            manager.CreateQueue(queueName);

            return queueName;
        }

        return string.Empty;
    }
    catch (Exception e)
    {
        Logging.Instance.Fatal(e.ToString());
        return string.Empty;
    }
}

创建队列后,大约3.000条带有billing-info的消息(只有账单的数据库ID)被添加到队列中。

为了处理队列,我想使用Azure Worker角色。我创建了一个Azure Service项目,并在项目中添加了Worker Role with Service Bus Queue辅助角色。

现在,在工作者角色的Run()方法中,&#34;仅#34;使用单个队列(取自示例代码):

// The name of your queue
const string QueueName = "ProcessingQueue";

通过为每个结算任务创建一个新队列,我感觉我在这里违背了规范:-)然而,由于它是关键的,因此肯定需要新的队列每月跟踪每个结算任务。

有没有办法将Worker Role与之前提到的动态创建的队列结合起来?

提前致谢。

1 个答案:

答案 0 :(得分:2)

我建议你非常'反对常态',因为我无法看到添加新队列如何让你跟踪从一个月到下一个月的消息。一旦消息成功发送到队列,并且一旦从工作者角色中的队列成功接收和处理消息,就有一个队列并记录消息(可能记录到DocumentDb实例?)会更有意义。

如果你绝对必须有单独的队列,我可以想到你可以使用的两种方法:

  1. 在服务配置中保留队列的名称;在每个月末,停止工作者角色,使用“新月”队列的名称更新服务配置并重新启动工作者角色。这有其明显的局限性,并不是恕我直言的正确方法。
  2. 为队列提供一个已知名称(例如'billing- [MONTH]'),其中[MONTH]是你可以在运行时从DateTime计算的东西(例如'billing-january','billing-august','billing - 十二月'等);在Worker Role运行循环中,您可以根据新队列名称动态创建侦听器并轮询队列。
  3. 另类建议方法

    另一种方法是考虑查看服务总线主题和订阅。您可以拥有一个“结算”主题,每个月都有一个订阅(“1月”,“2月”,“3月”等)。工作者角色会监听每个订阅,并且只接收在“2月”发送的消息例如。消息创建者将发送到单个主题“结算”,将消息“BillingMonth”上的属性标记为“1月” - 然后将通过“1月”订阅进行订阅。

    有关服务总线主题和订阅的详细信息,请参阅https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/