动态服务总线主题订阅
Dynamic service bus topic subscriptions
这个问题是 的一个小问题 - 我需要根据以下要求构建一个基于 Azure 的文档发送器应用程序:
- 用户可以通过 Web 界面(http、文件、电子邮件)配置多个不同类型的端点,这些端点会将文档发送到相应的端点类型(即对于 http,webapi 端点,对于文件,只需将其复制到文件夹位置)。每个端点都将被赋予一个名称。
- 每个端点都必须充当队列 - 发送到该端点的消息(文档)需要按顺序处理。需要一次处理一条消息。
- 对于一个端点 'stuck' 的消息(即因为它发送到的 http 端点已关闭)不应阻止其他端点上的消息处理。
- 可以删除端点。
- 端点的详细信息存储在 SQL 数据库中。
自然而然地,使用 azure 服务总线队列会对此有所帮助,我有一些代码可以通过 SB REST Api 创建主题和订阅。问题出在端点的动态特性上——我可以将每个端点表示为一个主题,但我如何才能为每个主题创建一个处理程序,该处理程序是使用用户指定的名称动态创建的?具体来说,我无法为服务总线主题创建函数触发器,因为这依赖于预先了解主题名称。我想拥有一个逻辑应用程序,其中包含每个主题的触发器处理程序(并调用 azure 函数),但这也需要了解主题名称。另一种选择是只有一个主题并有多个过滤器,但这是否会满足上述要求并且似乎不如拥有多个主题好(更不用说即使使用过滤器查询它们基本上基于固定值?)。那么什么样的设计才能满足这些要求呢?
首先我不确定这里是否需要使用主题订阅模式,为什么不直接使用队列呢?尽管如此,在这两种情况下,我们都必须面对动态 queue/subscription 名称问题。
- 如果您能在高级计划中负担得起服务总线,请使用事件网格。所有消息的通用事件,因此您可以基于此触发 function/logicApp,然后提取适当的消息。阅读下面链接的文档:
- https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-to-event-grid-integration-example
- https://github.com/Azure/azure-service-bus/blob/master/samples/DotNet/Azure.Messaging.ServiceBus/ServiceBusEventGridIntegrationV2/FunctionApp1/ReceiveMessagesOnEvent.cs
- 如果您的 queue/subscription 是动态创建的,请对消费者执行相同的操作。如果用户创建新端点,则创建新 queue/subscription 和新逻辑 app/Function。使用 terraform 或 ARM 模板。如果愿意,您可以尝试从 LogicApp 中进行操作,但实际上有很多不同的方法,只需选择适合您的方法即可。
我发现这个 post Managing a lot of azure service bus subscriptions 通过代码为服务总线主题订阅部署逻辑应用程序 ARM 模板,它做的事情与我需要的没有什么不同。
或者我可以有一个定时器功能,它简单地轮询每个主题的消息并处理它们 - 这可能是更简单的方法。
这个问题是
- 用户可以通过 Web 界面(http、文件、电子邮件)配置多个不同类型的端点,这些端点会将文档发送到相应的端点类型(即对于 http,webapi 端点,对于文件,只需将其复制到文件夹位置)。每个端点都将被赋予一个名称。
- 每个端点都必须充当队列 - 发送到该端点的消息(文档)需要按顺序处理。需要一次处理一条消息。
- 对于一个端点 'stuck' 的消息(即因为它发送到的 http 端点已关闭)不应阻止其他端点上的消息处理。
- 可以删除端点。
- 端点的详细信息存储在 SQL 数据库中。
自然而然地,使用 azure 服务总线队列会对此有所帮助,我有一些代码可以通过 SB REST Api 创建主题和订阅。问题出在端点的动态特性上——我可以将每个端点表示为一个主题,但我如何才能为每个主题创建一个处理程序,该处理程序是使用用户指定的名称动态创建的?具体来说,我无法为服务总线主题创建函数触发器,因为这依赖于预先了解主题名称。我想拥有一个逻辑应用程序,其中包含每个主题的触发器处理程序(并调用 azure 函数),但这也需要了解主题名称。另一种选择是只有一个主题并有多个过滤器,但这是否会满足上述要求并且似乎不如拥有多个主题好(更不用说即使使用过滤器查询它们基本上基于固定值?)。那么什么样的设计才能满足这些要求呢?
首先我不确定这里是否需要使用主题订阅模式,为什么不直接使用队列呢?尽管如此,在这两种情况下,我们都必须面对动态 queue/subscription 名称问题。
- 如果您能在高级计划中负担得起服务总线,请使用事件网格。所有消息的通用事件,因此您可以基于此触发 function/logicApp,然后提取适当的消息。阅读下面链接的文档:
- https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-to-event-grid-integration-example
- https://github.com/Azure/azure-service-bus/blob/master/samples/DotNet/Azure.Messaging.ServiceBus/ServiceBusEventGridIntegrationV2/FunctionApp1/ReceiveMessagesOnEvent.cs
- 如果您的 queue/subscription 是动态创建的,请对消费者执行相同的操作。如果用户创建新端点,则创建新 queue/subscription 和新逻辑 app/Function。使用 terraform 或 ARM 模板。如果愿意,您可以尝试从 LogicApp 中进行操作,但实际上有很多不同的方法,只需选择适合您的方法即可。
我发现这个 post Managing a lot of azure service bus subscriptions 通过代码为服务总线主题订阅部署逻辑应用程序 ARM 模板,它做的事情与我需要的没有什么不同。 或者我可以有一个定时器功能,它简单地轮询每个主题的消息并处理它们 - 这可能是更简单的方法。