如何在Azure WebJob函数中执行异步

2024-04-10

我有一个从服务器获取 api 数据的异步方法。当我在本地计算机上的控制台应用程序中运行此代码时,它会高速执行,每分钟在异步函数中推送数百个 http 调用。然而,当我将相同的代码从 Azure WebJob 队列消息触发时,它似乎同步运行,并且我的数字在爬行 - 我确信我的方法中缺少一些简单的东西 - 感谢任何帮助。

(1) .. WebJob 函数侦听队列上的消息并在收到消息时启动 api get 进程:

public class Functions
    {
        // This function will get triggered/executed when a new message is written 
        // on an Azure Queue called queue.

        public static async Task ProcessQueueMessage ([QueueTrigger("myqueue")] string message, TextWriter log)
        {
            var getAPIData = new GetData();
            getAPIData.DoIt(message).Wait();
            log.WriteLine("*** done: " + message);
        }
    }

(2) azure外部以异步模式快速工作的类...

 class GetData
    {
        // wrapper that is called by the message function trigger
        public async Task DoIt(string MessageFile)
        {
            await CallAPI(MessageFile);
        }

        public async Task<string> CallAPI(string MessageFile)
        {
            /// create a list of sample APIs to call...
            var apiCallList = new List<string>();
            apiCallList.Add("localhost/?q=1");
            apiCallList.Add("localhost/?q=2");
            apiCallList.Add("localhost/?q=3");
            apiCallList.Add("localhost/?q=4");
            apiCallList.Add("localhost/?q=5");

            // setup httpclient
            HttpClient client =
                new HttpClient() { MaxResponseContentBufferSize = 10000000 };
            var timeout = new TimeSpan(0, 5, 0); // 5 min timeout
            client.Timeout = timeout;

            // create a list of http api get Task...
            IEnumerable<Task<string>> allResults = apiCallList.Select(str => ProcessURLPageAsync(str, client));
            // wait for them all to complete, then move on...
            await Task.WhenAll(allResults);

            return allResults.ToString();
        }

        async Task<string> ProcessURLPageAsync(string APIAddressString, HttpClient client)
        {
            string page = "";
            HttpResponseMessage resX;

            try
            {
                // set the address to call
                Uri URL = new Uri(APIAddressString);
                // execute the call
                resX = await client.GetAsync(URL);
                page = await resX.Content.ReadAsStringAsync();
                string rslt = page;
                // do something with the api response data
            }
            catch (Exception ex)
            {
                // log error
            }
            return page;
        }

    }

首先因为你的触发函数是async,你应该使用await而不是.Wait()。等待会阻塞当前线程。

public static async Task ProcessQueueMessage([QueueTrigger("myqueue")] string message, TextWriter log)
{
    var getAPIData = new GetData();
    await getAPIData.DoIt(message);
    log.WriteLine("*** done: " + message);
}

无论如何,您都可以从以下位置找到有用的信息文档 https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-how-to/#trigger

并行执行

如果您有多个函数监听不同的队列,则当同时收到消息时,SDK 会并行调用它们。

当单个队列接收到多条消息时也是如此。默认情况下,SDK 获取一次一批 16 个队列消息,并执行并行处理它们的函数。 批量大小是可配置的 https://azure.microsoft.com/en-us/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-how-to/#config。当正在处理的数量降至批次大小的一半时,SDK 会获取另一个批次并开始处理这些消息。因此,每个函数处理的最大并发消息数是批处理大小的一倍半。此限制分别适用于具有 QueueTrigger 属性的每个函数。

以下是配置批量大小的示例代码:

var config = new JobHostConfiguration();
config.Queues.BatchSize = 50;
var host = new JobHost(config);
host.RunAndBlock();

但是,同时运行太多线程并不总是一个好的选择,并且可能会导致性能下降。

另一种选择是扩展您的网络作业:

多个实例

如果您的 Web 应用程序在多个实例上运行,则连续的 WebJob 在每台计算机上运行,​​并且每台计算机将等待触发器并尝试运行函数。 WebJobs SDK 队列触发器会自动防止函数多次处理队列消息;函数不必编写为幂等的。但是,如果您想确保即使有多个主机 Web 应用程序实例,也只有一个函数实例运行,则可以使用 Singleton 属性。

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

如何在Azure WebJob函数中执行异步 的相关文章

随机推荐

  • 在 Android Studio 中使用 GameCircleSDK 时,多个 dex 文件定义了 Lcom/amazon/ags/BuildConfig

    我最近将 Android 项目从 Eclipse 导入到 AndroidStudio 中 一切都很顺利 我能够解决大多数问题 除了 GameCircleSDK 库模块的问题 我不断收到以下错误 UNEXPECTED TOP LEVEL EX
  • 如何获取文件 *.apk 在 Android 设备中的位置

    需要以编程方式从 Android 设备检索 apk 文件名的帮助吗 如果我只知道文件名的一部分 任何机构都可以提供一些 Android 方法来执行此操作 甚至可以在 Android 下运行 shell 命令来获取文件位置吗 另外 是否有一种
  • GroupBy 表达式翻译失败

    Model public class Application Key public int ApplicationId get set public DateTime CreatedAt get set public DateTime Co
  • 使用逻辑运算符进行 Laravel 表单验证

    当用户填写消息 文本区域 时 他 她无法填写日期 时间 地点值 仅当 Message 为空且所有这三个字段均已填充时 才会考虑这三个字段 如何使用 Laravel 表单验证来做到这一点 是否可以在Request的规则方法中定义这些逻辑 我是
  • 如何禁用部分 UISegmentedControl?

    以下是代码UISegmentedControl UISegmentedControl segmentedControl UISegmentedControl alloc initWithItems NSArray arrayWithObje
  • 来自 ISO8601 时间戳字符串的 Django 模型 DateTimeField

    这里是 Django 新手 我正在为带有字符串时间戳的 SQLite 数据库制作 Django 模型 例如2014 09 23T18 43 26 692Z 因为我想最终使用 Django 的过滤引擎进行查询 而不是使用strftime 我希
  • 如何获取故障转储

    我需要从程序中获取故障转储 我怎样才能得到它 该程序是用 C 编写的 故障转储到底是什么 它是什么时候创建的 它保存在哪里 我如何阅读它 既然你说的是 C 我假设你使用的是 Windows 平台 故障转储 或简称转储 是特定时间点进程的完整
  • Hibernate 抛出 HibernateQueryException:无法解析属性

    所以我有一个在休眠中定义为实体的表 如下所示 Entity Table name sec Preference public class Preference private long id Column name PreferenceId
  • 注册新成就:(#3502) 成就 URL 中的对象不是 game.achievement 类型

    我正在尝试为我的游戏添加新成就 当我尝试在 Graph API Explorer 上测试它时 我收到以下错误 3502 成就 URL 中的对象不是 game achievement 类型 我按照这篇文章 http developers fa
  • 在asp.net中使用doPostBack函数

    我想在我的链接中使用 doPostBack 函数 当用户单击它时 它不会重定向到另一个页面 并且页面将回发 我正在使用此代码 但它不起作用 我错过了哪里 lt a id Sample href javascript doPostBack P
  • 使用 GitHub 管理多个用户

    有人可以咨询我一件事吗 我们有一个项目 我们刚刚决定雇用更多程序员来完成它 到目前为止 我是唯一一个在 GitHub 上备份代码的程序员 但现在我需要找到一种安全的方法来管理多个程序员 因此 私有项目有一个主分支 其他程序员应该能够克隆它
  • 加载动态创建的 ASCX 控件(通过代码)

    我正在创造Web User Controls通过代码 我的 C 代码写出标记 代码隐藏和设计器文件在回调时写入磁盘 控件创建得很好 我可以将它们添加到我的网络项目中并将它们放在页面上 当我尝试使用加载控件时LoadControl path
  • 如何根据单元格值更改PHP中的单元格表格颜色?

    我刚刚开始使用 php 编程 我做了一个从数据库返回值的表 我正在尝试执行以下操作 根据第三列的值更改其颜色 我也是这么想的 但是数值重复了 而且颜色也不对 有人可以帮我吗 你明白我的问题了吗 谢谢你们 我带来的不便表示歉意 Code ta
  • 防止 Django 表单中的 SQL 注入

    我用它来验证 class MyValidationForm forms Form title forms CharField body forms Textarea taxonomy forms IntegerField 这是我基于阶级的观
  • 使用 Google Apps 脚本插入数据验证

    我正在尝试使用 Google Apps 脚本在 Gsheet 中插入单元格内下拉菜单 数据 gt 验证 gt 项目列表 我想这样做是因为每次我使用电子表格时 项目列表 都会略有变化 我不想每次打开电子表格时都必须转到 数据 gt 验证 gt
  • (Wordpress)我如何获取带有 html 标签的帖子的完整内容 - 未剥离

    我在我的网站上使用 WordPress 和 qtranslate 插件 并且尝试在每篇文章中显示语言标志 Qtranslate 将 html 标签插入到内容和标题中 例如 en gt 对于我在每篇文章中使用的每种语言 所以我需要一个条件来检
  • 用于 Java 项目的 NetBeans 远程编辑?

    我的项目使用了 Play 框架 所以我不需要可以编译的编辑器 我通常喜欢 NetBeans 但希望远程编辑服务器上的源文件以节省时间 我还经常在台式机 上网本之间切换进行开发 因此远程编辑可以使我免于同步开发环境 我对 Netbeans 远
  • 如何根据调试标志让 Django 使用两个不同的数据库

    我想在本地环境中使用简单的 SQLite 数据库 并在生产中使用 Postgresql 数据库 如何配置设置文件以根据以下值了解要使用哪个数据库DEBUG 有多种选择 下面是一个非常便宜的解决方案 Django 始终选择名为 default
  • webpack 是否使 ES6 模块兼容 ES5 浏览器?

    如果我使用ES6导入在 JS 文件中 例如 import tempates from templates js webpack 转换这类似于 webpack require r webpack exports harmony import
  • 如何在Azure WebJob函数中执行异步

    我有一个从服务器获取 api 数据的异步方法 当我在本地计算机上的控制台应用程序中运行此代码时 它会高速执行 每分钟在异步函数中推送数百个 http 调用 然而 当我将相同的代码从 Azure WebJob 队列消息触发时 它似乎同步运行