一个队列上的多个 Azure Web 作业实例(第 2 部分)



我正在寻找一些有关如何设置处理单个队列的 Azure Web 作业的多个实例的文档。我遇到了这篇文章:一个队列上的多个 Azure Web 作业实例,这很有帮助。我最大的收获是,如果我将应用服务横向扩展到多个实例,"每个作业实例将从队列中选取不同的消息。这很好,它确保我的工作不会被重复。

但是,我想知道如果我创建一个重复的、单独的应用服务(每个服务上具有相同的 Web 作业(,并同时运行这两个(或更多(实例,而不是简单地"横向扩展",情况是否也是如此。这样做的原因仅仅是因为我需要更多的出站 IP 地址。我的 Web 作业使用的第三方 API 按 IP 地址限制我。因此,随着我的应用获得更多用户,并且我"横向扩展",我开始从这个第三方 API 获得越来越多的超时。我建议的解决方案是创建本质上是克隆的单独应用服务。但我想确保来自队列的作业不会重复。

作为参考,这是我的网络工作功能的样子:

public void ProcessQueueMessageAsync([QueueTrigger("quicktransferqueue")] string message, ILogger logger)
{
var model = Newtonsoft.Json.JsonConvert.DeserializeObject<QuickTransferModel>(message);
//Hit my third-party API here...
}

使用 QueueTrigger 的 Web 作业(和 Azure Functions(将为你处理队列消息可见性,并在处理消息时立即隐藏消息。 这有效地锁定了它,使其不让其他工作线程在给定的时间间隔内使用它(如果您的函数失败,它不会立即将其从队列中删除(。 成功完成函数调用后,它将被删除。 QueueTrigger 是来自单个函数的多个实例,还是来自访问同一队列的多个不同函数,这并不重要。 由于它们会立即"隐藏"拉取的消息,因此尝试轮询队列的另一个进程不会看到正在积极处理的消息。 队列本身不知道有多少不同的作业/功能正在尝试访问它 - 它只是管理消息及其可见性。 简而言之,你是安全的。

最新更新