从具有工作者角色的多个动态队列接收 Azure 服务总线消息
Receiving Azure service bus messages from multiple, dynamically queues with worker role
我正在尝试解决在 Azure 服务总线上创建多个队列(即每月一个队列)的问题。队列中的消息包含有关客户账单的信息。队列是这样创建的:
/// <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 条带有账单信息的消息(不过只有账单的数据库 ID)被添加到队列中。
为了处理队列,我想使用 Azure 辅助角色。我创建了一个 Azure 服务项目并向该项目添加了一个 Worker Role with Service Bus Queue
辅助角色。
现在,在 Worker Role 的 Run()
方法中,"only" 使用单个队列(取自示例代码):
// The name of your queue
const string QueueName = "ProcessingQueue";
我觉得我在这里违反规范,为每个计费任务创建一个新队列 :-) 但是,肯定需要一个新队列,因为每次跟踪每个计费任务至关重要月.
有什么方法可以将工作者角色与前面提到的动态创建的队列结合起来吗?
提前致谢。
我建议你非常 'working against the norm' 在这里,因为我看不出添加一个新队列如何让你跟踪一个月到下一个月的消息。拥有一个队列并在消息成功发送到队列后记录消息(可能记录到 DocumentDb 实例?)以及在您的工作者角色中从队列成功接收和处理消息后记录消息会更有意义。
如果您绝对必须有单独的队列,我可以想到您可以使用的两种方法:
- 在服务配置中保留队列的名称;在每个月底,停止工作者角色,使用 'new month' 队列的名称更新服务配置并重新启动工作者角色。这有其明显的局限性,恕我直言,这不是正确的方法。
- 为队列提供一个已知名称(例如 'billing-[MONTH]'),其中 [MONTH] 是您可以根据 DateTime 在 运行 时间计算的名称(例如 'billing-january'、'billing-august'、'billing-december'等);在您的 Worker Role 运行-loop 中,您可以根据新队列名称动态创建侦听器并轮询队列。
另一种建议方法
一种替代方法是考虑查看服务总线主题和订阅。您可以有一个 'Billing' 主题,每个月都有一个订阅('January'、'February'、'March' 等)工作者角色将监听每个订阅并且只接收例如,在 'February' 中发送的消息。消息创建者将发送到单个主题 'Billing',将消息 'BillingMonth' 上的 属性 标记为 'January' - 然后将由 'January' 订阅订阅。
有关服务总线主题和订阅的详细信息,请参阅 https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/
我正在尝试解决在 Azure 服务总线上创建多个队列(即每月一个队列)的问题。队列中的消息包含有关客户账单的信息。队列是这样创建的:
/// <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 条带有账单信息的消息(不过只有账单的数据库 ID)被添加到队列中。
为了处理队列,我想使用 Azure 辅助角色。我创建了一个 Azure 服务项目并向该项目添加了一个 Worker Role with Service Bus Queue
辅助角色。
现在,在 Worker Role 的 Run()
方法中,"only" 使用单个队列(取自示例代码):
// The name of your queue
const string QueueName = "ProcessingQueue";
我觉得我在这里违反规范,为每个计费任务创建一个新队列 :-) 但是,肯定需要一个新队列,因为每次跟踪每个计费任务至关重要月.
有什么方法可以将工作者角色与前面提到的动态创建的队列结合起来吗?
提前致谢。
我建议你非常 'working against the norm' 在这里,因为我看不出添加一个新队列如何让你跟踪一个月到下一个月的消息。拥有一个队列并在消息成功发送到队列后记录消息(可能记录到 DocumentDb 实例?)以及在您的工作者角色中从队列成功接收和处理消息后记录消息会更有意义。
如果您绝对必须有单独的队列,我可以想到您可以使用的两种方法:
- 在服务配置中保留队列的名称;在每个月底,停止工作者角色,使用 'new month' 队列的名称更新服务配置并重新启动工作者角色。这有其明显的局限性,恕我直言,这不是正确的方法。
- 为队列提供一个已知名称(例如 'billing-[MONTH]'),其中 [MONTH] 是您可以根据 DateTime 在 运行 时间计算的名称(例如 'billing-january'、'billing-august'、'billing-december'等);在您的 Worker Role 运行-loop 中,您可以根据新队列名称动态创建侦听器并轮询队列。
另一种建议方法
一种替代方法是考虑查看服务总线主题和订阅。您可以有一个 'Billing' 主题,每个月都有一个订阅('January'、'February'、'March' 等)工作者角色将监听每个订阅并且只接收例如,在 'February' 中发送的消息。消息创建者将发送到单个主题 'Billing',将消息 'BillingMonth' 上的 属性 标记为 'January' - 然后将由 'January' 订阅订阅。
有关服务总线主题和订阅的详细信息,请参阅 https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/