动态服务总线主题订阅

时间:2021-05-18 15:10:57

标签: azureservicebus azure-logic-apps

这个问题来自 this - 我需要构建一个基于 Azure 的文档发送器应用程序,并满足以下要求:

  1. 用户可以通过 Web 界面(http、文件、电子邮件)配置不同类型的多个端点,该接口会将文档发送到相应的端点类型(即对于 http,webapi 端点,对于文件,只需将其复制到文件夹位置)。每个端点都将被赋予一个名称。
  2. 每个端点都必须充当一个队列 - 发送到该端点的消息(文档)需要按顺序处理。需要一次处理一条消息。
  3. 为一个端点“卡住”的消息(即,因为其发送到的 http 端点已关闭)不应阻止其他端点上的消息处理。
  4. 可以删除端点。
  5. 端点的详细信息存储在 SQL 数据库中。

自然地使用 Azure 服务总线队列会促进这一点,我有一些代码可以通过 SB REST Api 创建主题和订阅。问题出现在端点的动态特性上 - 我可以将每个端点表示为一个主题,但是如何为每个主题使用用户指定的名称动态创建的处理程序?具体来说,我无法为服务总线主题创建函数触发器,因为这依赖于预先知道主题名称是什么。我想过有一个逻辑应用程序,其中包含每个主题的触发器处理程序(并调用一个 azure 函数),但这也需要知道主题名称。另一种选择是只有一个主题并有多个过滤器,但这是否满足上述要求并且似乎不如拥有多个主题(更不用说即使过滤器查询它们基本上基于固定值?)。那么什么样的设计才能满足这些要求?

2 个答案:

答案 0 :(得分:0)

首先我不确定这里是否需要使用 Topic-Subscription 模式,为什么不直接使用队列?尽管如此,在这两种情况下,我们都必须面对动态队列/订阅名称问题。

  1. 如果您能负担得起高级计划中的 Service Bus,请使用 Event Grid。事件通常适用于所有消息,因此您可以基于该事件触发您的函数/逻辑应用程序,然后提取正确的消息。阅读以下链接的文档:

enter image description here

  1. 如果您的队列/订阅是动态创建的,请对消费者执行相同的操作。如果用户创建了新端​​点,则创建了新队列/订阅和新逻辑应用程序/函数。使用 terraform 或 ARM 模板。如果您愿意,您可以尝试从 LogicApp 执行此操作,但实际上有很多不同的方法可以执行此操作,只需选择适合您的方法即可。

enter image description here

答案 1 :(得分:0)

我发现这篇文章 Managing a lot of azure service bus subscriptions 通过为服务总线主题订阅通过代码部署逻辑应用程序 ARM 模板来完成与我需要的内容并无不同的内容。 或者,我可以有一个计时器功能,它可以简单地轮询每个主题以获取消息并处理它们 - 这可能是更简单的方法。