限制 Azure Functions 队列上的并发作业数

2023-12-15

我在 Azure 中有一个函数应用程序,当将项目放入队列时会触发该应用程序。它看起来像这样(大大简化):

public static async Task Run(string myQueueItem, TraceWriter log)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(Config.APIUri);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        StringContent httpContent = new StringContent(myQueueItem, Encoding.UTF8, "application/json");
        HttpResponseMessage response = await client.PostAsync("/api/devices/data", httpContent);
        response.EnsureSuccessStatusCode();

        string json = await response.Content.ReadAsStringAsync();
        ApiResponse apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json);

        log.Info($"Activity data successfully sent to platform in {apiResponse.elapsed}ms.  Tracking number: {apiResponse.tracking}");
    }
}

这一切都很好并且运行得很好。每次将项目放入队列时,我们都会将数据发送到我们这边的某个 API 并记录响应。凉爽的。

当“生成队列消息的事物”出现大幅增长并且同时将大量项目放入队列时,就会出现问题。这种情况往往在一分钟内发生大约 1,000 - 1,500 个项目。错误日志会有类似这样的内容:

2017-02-14T01:45:31.692 mscorlib:执行函数时出现异常: Functions.SendToLimeade。 f-SendToLimeade__-1078179529:错误 发送请求时发生。系统:无法连接到 远程服务器。系统:每个套接字地址只能使用一次 (协议/网络地址/端口)通常是允许的 123.123.123.123:443。

起初,我认为这是 Azure Function 应用程序耗尽本地套接字的问题,因为此处图示。然而,后来我注意到了IP地址。 IP 地址 123.123.123.123(当然在本示例中有所更改)是我们的 IP 地址,即 HttpClient 发送到的 IP 地址。所以,现在我想知道是不是our服务器耗尽套接字来处理这些请求。

不管怎样,我们这里都存在一个扩展问题。我正在尝试找出解决该问题的最佳方法。

一些想法:

  1. 如果是本地套接字限制,上面的文章有一个使用增加本地端口范围的示例Req.ServicePoint.BindIPEndPointDelegate。这看起来很有希望,但是当你truly需要扩展吗?我不希望这个问题在两年后再次出现。
  2. 如果是远程限制,看起来我可以控制 Functions 运行时一次处理的消息数量。这里有一篇有趣的文章说你可以设置serviceBus.maxConcurrentCalls为 1 并且一次只会处理一条消息。也许我可以将其设置为一个相对较低的数字。现在,在某个时刻,我们的队列填满的速度将快于我们处理它们的速度,但那时的答案是在我们的一端添加更多服务器。
  3. 多个 Azure Functions 应用程序?如果我有多个 Azure Functions 应用程序并且它们都在同一队列上触发,会发生什么情况? Azure 是否足够智能,可以在功能应用程序之间分配工作,并且我可以拥有一大群机器来处理我的队列,并且可以根据需要扩大或缩小队列?
  4. 我也遇到过保持活动的情况。在我看来,如果我能以某种方式在队列消息涌入时保持套接字打开,也许会有很大帮助。这可能吗?关于我如何做到这一点有什么建议吗?

如果您对此类系统的推荐(可扩展!)设计有任何见解,我们将不胜感激!


我认为代码错误的原因是:using (var client = new HttpClient())

引自不正确的实例化反模式:

该技术不可扩展。创建一个新的 HttpClient 对象 每个用户请求。在重负载下,Web 服务器可能会耗尽 可用套接字的数量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制 Azure Functions 队列上的并发作业数 的相关文章

随机推荐

  • FB.getLoginStatus 始终返回 status='unknown'

    如果我登录到 facebook com 我希望调用 FB getLoginStatus 将返回 status not authorized 相反 即使我为 force 参数传递 true 它也会返回 status unknown 如果我调用
  • Delphi 类似“闹钟”的应用程序

    我需要制作一个简单的闹钟应用程序 它不是播放声音 而是将文件上传到 ftp 弄清楚了后者 事实证明计时器是无效的当涉及到执行一个线程时 这是我到目前为止得到的 var ttime tDateTime timerstr string time
  • sqlite 数据库在插入时被锁定

    有一个简单的代码 var insert INSERT INTO files Name FullName MD5 VALUES Name FullName MD5 using var con db OpenConnection using v
  • Hibernate 4.3.6 QuerySyntaxException:连接所需的路径

    HQL 连接查询有问题 谁能告诉我下面的连接 HQL 查询有什么问题吗 我使用 Hibernate 4 3 6 JDK 7 和 Groovy 2 2 def query select lip referenceId from Parcel
  • 在 HQL 中执行日期/时间数学?

    我正在寻找如何在 HQL 查询中执行日期 时间数学 具体来说 如何从结果中添加或减去 x 时间量current timestamp 功能 或者我是否必须为此使用 SQL 并希望正在运行的任何数据库都支持它 HQL查询示例 FROM Rand
  • 如何在MVC4的编辑模式下将值传递给下拉字段?

    您好 我的视图中有三个字段 这三个字段已下拉 我想在单击编辑按钮时将值传递给这些字段 这是需要传递到下拉字段的值 下面提到我的观点 在我看来 我有很多下拉菜单 但一旦我知道如何将值传递给一个下拉菜单 就意味着我将为另一个下拉菜单执行此操作
  • python 的 dict .get() 方法如何检查默认参数?

    我遇到了一种奇怪的 Python 行为 很难向自己解释 当我传递一个默认值以从字典中获取键时 看起来它首先尝试找到该默认值 然后查看键是否存在 如果字典中存在该键 则会抛出错误 为什么会发生这种情况 from collections imp
  • Gradle:Uber Jar 创建失败并显示“无法扩展 ZIP”

    我正在尝试使用 Gradle 创建一个 Fat Uber jar 不幸的是 我不断遇到以下错误 gt Task fatJar FAILED FAILURE Build failed with an exception What went w
  • PHP 和 Codeigniter。如何返回数组对象而不是普通数组?

    在 Codeigniter 中 我创建一个数组并将其返回给用户 我正在创建这样的数组 结果是数据库查询的返回形式 array email gt result 现在它输出 email id 629 desc 0000 value 1 0000
  • 可编辑复杂SQL查询的QTableView

    如何制作可编辑的 QTableView 显示复杂 SQLite 查询中的数据 我需要用多个 SQLite 表中的数据填充 QTableView 这需要由用户可编辑 由于查询有点复杂 包括 JOIN 和 CASE WHEN 等 我通过 QSq
  • vbs 脚本中的 If-Else If 语句

    我需要知道如何制作 if else if 语句 以便根据用户按下的按钮 答案 显示不同的消息 您可以使用If ElseIf and End If指令 If i 10 Then response write Just started Else
  • 如何在 jQuery 中获取第一个元素而不是使用 [0]?

    我是 jQuery 的新手 如果这是一个愚蠢的问题 我深表歉意 当我使用它使用 id 查找元素时 我知道总是有一个匹配项 为了访问它 我将使用索引 0 有更好的方法吗 例如 var gridHeader grid GridHeader 0
  • 将包含字典的单元格分解为 Pandas 中的多行[重复]

    这个问题在这里已经有答案了 如何将包含字典的单元格中的内容分解为 Pandas 中的多行 ID CODES A 1407273790 5 1801032636 20 1174813554 1 1215470448 2 1053754655
  • 加载多个 javascript 文件 - jquery

    我使用下面的代码动态加载js脚本 getScript site js test js done function script textStatus console log test js textStatus 如果我想在同一段代码中加载多
  • 简单的 D3 演示不适用于更改后的结构

    我正在关注official教程 由于结构相当简陋 我决定做一个更干净的结构
  • 从简单的 get 返回 403 Forbidden 但在浏览器中加载正常

    我试图从页面获取一些数据 但它返回错误 403 禁忌 我以为是用户代理 但我尝试了几个用户代理 它仍然返回错误 我也尝试使用图书馆假用户代理但我没有成功 with requests Session as c url headers User
  • 可放入 Famous.js 中吗?

    我正在尝试在known djs 中实现可拖动 可放置的图像 也就是说 如果图像掉落到正确的表面上 就会触发事件 在我的可拖动图像上 我正在监听 touchend 事件 这里没问题 我还有一个连接到我的 目标 表面的 touchend 事件
  • 为什么 List 分区有效而 span 无效

    我有这个 Char Int pars 的列表 它包含仅具有唯一 Char 值的对 List 3 d 1 e 3 h 3 i 1 l 3 o 2 r 2 t 1 w 1 我需要将此列表分为 2 个 一个包含任何具有 d 字符的对 另一个是其余
  • Python 2.7:奇怪的 Unicode 行为

    我在 Python 2 7 中遇到以下行为 gt gt gt a1 u U0001f04f 1 gt gt gt a2 u ud83c udc4f 2 gt gt gt a1 a2 3 False gt gt gt a1 encode ut
  • 限制 Azure Functions 队列上的并发作业数

    我在 Azure 中有一个函数应用程序 当将项目放入队列时会触发该应用程序 它看起来像这样 大大简化 public static async Task Run string myQueueItem TraceWriter log using