2

我目前正在评估使用服务总线和天蓝色功能来触发某些需要通过下游api调用完成的工作。除了我无法很好地处理下游系统过载和/或将报头返回到节流状态(即每分钟最大呼叫数/等)时,会发生什么情况。我们似乎没有对队列触发器强制调节的任何动态控制。Azure功能 - 限制服务总线触发

我知道我们可以手动设置max concurrency,但这并不一定能解决问题,因为我们无法控制下游系统,需要考虑随时可能处于脱机状态或缓慢状态。

此外,我们可以创建消息,使它们按照一定的速率流入,但下游系统仍然可以饱和或返回速率限制。

选项1:

假设消费计划,从解决方案的角度来看,这是一个方式,我能想到的:

  • 队列1 - 全速或最高速度。如果我们开始获得速率限制,请设置缓存值。如果设置了缓存值,则不处理该消息,将其克隆并放入队列2
  • Queue2 - 每个最大并发/预取计数下限。与上面相同的过程,但推入队列3。
  • 队列3 - 最大每最大并发/预取计数。我们只是慢慢地处理它们。

基本上,当下游系统饱和时,队列1成为队列2和队列3的控制器。

选项2:

我们可以克隆的消息,并在未来进行重新排队,并继续这样做,直到他们的所有进程。保持一个队列,只需要等待,直到我们得到处理。

方案3:

假设我们有我们的是专用的,而不是消耗自己的应用程序的计划,我想我们可以Thread.Sleep,如果他们越来越接近成为速率限制或向下,并不断重试功能。这可能可能是最大并发性,实例和速率限制的计算。我不会在消费计划中考虑这一点,因为睡眠可能会大幅增加成本。

我不知道如果我失去了一些东西以最好的方式简单处理下游饱和或节流队列触发(可能是服务总线或存储队列)

编辑: 我想补充一点,我将100万条消息抽入服务总线队列,该队列在发送时计划。我观察Azure功能(消费计划)规模达到每秒1500次左右,以提供良好的指标。我不确定这些专用的程序如何执行。

它看起来可以即时修改主机文件,并且设置立即生效。虽然这是针对所有功能的,但在特定情况下可能会起作用(更新设置并根据速率限制每隔一分钟重新检查一次)。

This看起来它可能是一个正确的方向,当它被功能团队实现时迈出的一步,但即便如此,我们仍然需要一种方法来管理下游错误。

+0

您想避免功能过载并保证服务总线队列消息的传递吗? –

+0

是的保证传递,消息需要处理。函数超载我打开最好的选择。 – lucuma

回答

0

不幸的是,您需要的背压功能目前无法使用服务总线触发器(以及更一般的Azure功能),因此您需要自己处理。

您所描述的方法可行,您只需要在不同的功能应用程序中处理它,因为服务总线设置适用于整个应用程序,而不仅仅是一个功能。

在您的场景中可能不是一个巨大的帮助,但对于处理队列2或3的应用程序,您还可以尝试使用预览标志,以限制应用程序的扩展实例数:WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT。请注意,这是在预览中,并没有保证。

我鼓励你在记录你的场景的functions repo上打开一个问题。这类问题绝对是我们想要解决的问题,我们获得的反馈越多越好。

+0

谢谢,我们可能会有我们自己的专用应用程序计划,并且现在将在各种排队中管理它。我会开一个问题。我注意到我可以更新主机文件,但了解它适用于所有队列。我在文档中没有看到的是服务总线处理的“最大”吞吐量,假设一个小尺寸的消息,以及如何根据队列大小计算扩展的参数。 – lucuma

0

就这样,除了正常的api端点之外,您是否可以要求下游的人提供队列端点? 然后你可以淹没他们的队列,他们可以在闲暇时处理它。