首页 文章

从具有辅助角色的多个动态队列接收Azure服务总线消息

提问于
浏览
1

我正在尝试解决在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)添加到队列中 .

为了处理队列,我'd like to make use of the Azure Worker Role. I' ve创建了一个Azure Service项目,并为项目添加了一个 Worker Role with Service Bus Queue worker角色 .

现在,在Worker Role的 Run() 方法中,"only"使用了一个队列(取自示例代码):

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

通过为每个计费任务创建一个新队列,我感觉我在这里违背规范:-)然而,由于每个月跟踪每个计费任务至关重要,因此肯定需要新的队列 .

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

提前致谢 .

1 回答

  • 2

    我建议你在这里非常“反对规范”,因为我看不出添加新队列如何允许你跟踪从一个月到下一个月的消息 . 一旦消息成功发送到队列,并且一旦从工作者角色中的队列成功接收和处理消息,就有一个队列并记录消息(可能记录到DocumentDb实例?)会更有意义 .

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

    • 在服务配置中保留队列的名称;在每个月末,停止工作者角色,使用'new month'队列的名称更新服务配置并重新启动工作者角色 . 这有其明显的局限性,并不是恕我直言的正确方法 .

    • 为队列提供一个已知名称(例如'billing-[MONTH]'),其中[MONTH]是您可以在运行时从DateTime计算的(例如'billing-january','billing-august','billing-december'等);在Worker Role运行循环中,您可以根据新队列名称动态创建一个侦听器并轮询队列 .

    An Alternative, Suggested Approach

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

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

相关问题