WebJob ServiceBus 主题权限

WebJob ServiceBus Topic permissions

我参与了一个多层项目,其中一部分正在使用来自第三方系统的 "events" 流。供应商通过 Azure 服务总线主题发布这些——他们提供、控制和管理总线。我们只需提供 URI、主题名称和订阅详细信息。

我们的方法是将 Webjob 组合在一起,使用 SDK 中提供的 ServiceBusTrigger 来处理新消息的侦听并触发将它们处理到我们的系统中。然而,我们似乎遇到了障碍,因为作业不断地无法从主题中读取。作业失败并显示模糊的 Timeout Exception:

Unhandled Exception: System.TimeoutException: The timeout elapsed upon attempting to obtain a token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'. 
---> System.IdentityModel.Tokens.SecurityTokenException: The token provider was unable to provide a security token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'. 
Token provider returned message: 'The operation has timed out'.

但再往下,痕迹包括:

[ERR] at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
[ERR] at Microsoft.ServiceBus.NamespaceManager.OnEndTopicExists(IAsyncResult result)
[ERR] at Microsoft.ServiceBus.NamespaceManager.EndTopicExists(IAsyncResult result)

供应商随后确认订阅对主题的唯一许可/声明是 Listen

谁能确认 ServiceBusTrigger 的权限要求是什么?

作为 +1,假设它出于某种原因需要更多 Listen(即需要 Manage),有人愿意提出替代方法吗?失去 WebJob 基础设施似乎是一种耻辱(该项目已经有 3 个其他工作)——尤其是失去像异步和并发处理来自主题的消息这样的功能

SDK 进行以下需要管理权限的调用。 Microsoft.Azure.WebJobs.ServiceBus.Listeners.NamespaceManagerExtensions。 如果您无法设置这些权限,一种替代方法是不将 SDK 用于服务总线触发器,而是将其用于其他所有内容。

为了解决这个问题,我们对 WebJobs SDK 进行了建议的更改(此处的拉取请求:https://github.com/Azure/azure-webjobs-sdk/pull/528)。这将在下一个版本中。以下是如何指定每个属性的访问权限的示例:

public static void JobFunction(
    [ServiceBusTrigger("inputqueue", AccessRights.Listen)] string message,
    [ServiceBus("outputqueue", AccessRights.Send)] out string message)
{
    . . .
}

未指定时,默认为"Manage"。当设置为管理以外的任何内容时,SDK 将不会尝试创建任何 SB 资源。我认为这可以满足您的需求?