【Azure Logic App】添加 Storage Account 来提升 Logic App 的性能
Scaling Logic App Standard for High Throughput Scenarios
Logic Apps 提供了一个强大的平台,可以无缝集成各种服务,包括数据库、消息系统和 PaaS 和 SaaS 产品。此外,它支持各种连接协议,使您能够创建全面的集成解决方案。通过使用其直观的工作流设计器和广泛的连接器,Logic Apps 赋予开发人员高效构建复杂解决方案的能力。此外,它的用户友好的管理和监控能力确保了应用程序生命周期的顺利管理。
一个常见的问题是,Logic Apps 是否能有效地扩展以应对高吞吐量要求的苛刻场景。为了提供一些背景,这里有几个高吞吐量场景的例子:
- 每天,我们在特定时间收到惊人的 100 万张发票。我们的目标是在几个小时内处理所有这些订单。
- 是否可以利用一个 Logic App,在这段时间内动态扩展,使我们能够实现所需的高吞吐量?
- 随后,当不再需要进一步处理时,它应该缩小规模,使我们能够在保持所需吞吐量的同时优化成本。
- 我们的系统不断从事件中心接收事件流,这些事件在一天中的特定时间或随机地出现峰值负载,有时超过每分钟 10K 事件的速率。
事实上,上述问题的答案是肯定的。通过一些容量规划和对 Logic Apps 内部扩展功能的深入理解,实现更高吞吐量的场景变得像构建一个复杂的业务流程的工作流一样简单。
在这篇博客中,我们将深入探讨 Logic Apps 标准的扩展特性,并为设计可扩展的高吞吐量场景的 Logic Apps 提供宝贵的见解。
底层 Logic App 资源的可扩展性
Logic App 在运行工作流时使用两种主要资源 - 存储和计算。
存储
Logic Apps 中的有状态工作流利用存储(表和 blob)在运行时进行持久性数据存储并维护运行历史。此外,队列用于调度目的。单个存储帐户支持大量请求,每个分区最多可达 2K,帐户级别每秒可达 20K 请求(RPS)。超出这些阈值,请求速率将受到限制。有关存储可扩展性限制的更多信息,请参阅此处(https://learn.microsoft.com/en-us/azure/storage/tables/storage-performance-checklist#targets-for-data-operations)。
随着工作流执行速率的增加,需要注意的是,虽然单个存储帐户可以处理相当高的吞吐量,但有可能遇到分区级别限制或帐户级别限制。因此,理解潜在的限制和解决它们的方法变得至关重要,以确保顺畅的运营。
将您的 Logic App 扩展到存储限制
将负载分片到多个工作流
Logic Apps 引擎专门设计用于通过在多个分区之间分配存储事务来最小化分区级别的限制。但是,为了获得更好的分布并减轻分区级别的限制,建议将工作负载分布在两个或多个工作流中,而不是依赖单个工作流
将负载分片到多个存储帐户
为了显著提高吞吐量,可以设置 Logic App 以将其负载分布在多个存储帐户中,最多可达 32 个存储帐户。如果您的应用程序需要高吞吐量,建议使用多个存储帐户而不是依赖一个。一个普遍的指导方针是,每个存储帐户每分钟大约执行 100K 操作,以确定是否需要额外的存储帐户。请注意,虽然这个限制对于大多数情况来说都是一个好的数字,但如果您的工作流操作是计算密集型的(例如处理大量数据的查询操作),那么限制可能低于这个数字,因此在将您的解决方案投入生产之前,进行负载测试并调整您的解决方案总是一个好主意。
请参阅下面的附录,了解如何配置多个存储帐户的说明。
计算
在运行 Logic Apps Standard 时,有三种主要的计算选项需要考虑:WS1、WS3 和 WS3。这些选项提供不同数量的内存和核心计数。此外,如果您决定在 ASEv3(应用程序服务环境版本 3)中运行您的 Logic App,则会有更多的计算选项可供选择。
Logic Apps 的计算基础设施旨在动态扩展,以有效地处理不断增加的负载。动态扩展的决定是根据考虑两个主要因素来确定的。
Trigger 触发器
扩展器分析特定应用程序的工作流中使用的每个触发器,以确定扩展需求。例如,如果存在服务总线触发器并且队列长度持续增长,则扩展器将采取行动添加额外的实例,使其能够处理更多的消息。同样,当工作流中使用请求触发器并且请求延迟呈上升趋势时,将增加实例数量以更有效地分配请求负载。
工作流作业执行延迟
在运行时,工作流操作被分成单独的作业并排队等待执行。调度程序定期轮询作业队列以检索并执行这些作业(有关运行时如何调度和运行作业的更多详细信息,请参阅此文章)。但是,如果没有足够的计算能力来获取这些作业,它们将在队列中停留更长时间,导致执行延迟增加。扩展器将监控并做出扩展决策以控制执行延迟。
除了上述因素,扩展器还考虑最小和最大实例计数器配置以确定是否应该做出扩展决策,例如添加、删除或维持当前实例数量。通常,扩展器每隔大约 15-30 秒做出这些决定。重要的是要考虑上升时间及其对您的 Logic App 扩展速度的影响,以有效地处理峰值负载。例如,如果您的工作负载需要将您的 Logic App 从仅 1 个实例扩展到 100 个实例,仅上升就可能需要大约 25-50 分钟。Logic Apps 扩展与 Azure 函数共享相同的扩展基础设施,您可以在本文中了解更多关于 Azure 函数如何扩展的信息
为了更快地扩展,可以为每个 Logic App 单独配置计算。
每个 Logic App 都可以独立扩展,将负载分布在多个应用程序中可以显著加快扩展速度。例如,与单个应用程序相比,两个应用程序可以在相同的时间范围内扩展到两倍的实例数量。通过将负载分成多个应用程序,您可以有效地增加可扩展性并实现更快的扩展结果。 使用预热实例。如果您的场景需要更快的上升时间,您可能希望考虑使用预热实例。如果您的峰值负载时间是确定的,那么您可以使用自动化任务(详见此处)按计划调整这些预热实例。
请注意,如果您将 Logic App 放置在应用程序服务环境(ASEv3)内,则不可用动态扩展功能。您需要在关联的应用程序服务计划(ASP)上设置扩展规则。常用的扩展规则是使用 CPU 指标并扩展您的 ASP 以保持 VM CPU 在 50-70% 之间。详见此处(https://learn.microsoft.com/en-us/azure/azure-monitor/autoscale/autoscale-get-started)。
附录 - 使用多个存储帐户配置您的 Logic Apps。
以下步骤可用于使用多个存储帐户配置您的 Logic Apps,以实现更高的可扩展性。
请注意,您需要在创建新的 Logic Apps 之前执行这些配置步骤,并且在创建工作流之后更改这些设置可能会导致数据丢失或无法达到所需的可扩展性水平。
步骤 1:更新 host.json 以指定要使用的存储帐户数量。下面是一个使用 3 个存储帐户的 host.json 文件的示例:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle.Workflows",
"version": "[1.*, 2.0.0)"
},
"extensions": {
"workflow": {
"Settings": {
"Runtime.ScaleUnitsCount": "3"
}
}
}
}
需要通过Standard Logic App的高级工具Kudu站点进行修改:

步骤 2:创建 3 个存储帐户并保存相关的连接字符串
步骤 3:使用以下模式将连接字符串添加到应用程序配置中。从 00 到 {存储帐户数量 - 1}:
- CloudStorageAccount.Workflows.ScaleUnitsDataStorage.CU00.ConnectionString
- CloudStorageAccount.Workflows.ScaleUnitsDataStorage.CU01.ConnectionString
- CloudStorageAccount.Workflows.ScaleUnitsDataStorage.CU02.ConnectionString

步骤 4:使用与 CloudStorageAccount.Workflows.ScaleUnitsDataStorage.CU00.ConnectionString 键相同的连接字符串值更新 AzureWebJobsStorage 配置键
[End]
【Azure Logic App】添加 Storage Account 来提升 Logic App 的性能的更多相关文章
- [Windows Azure] What is a Storage Account?
What is a Storage Account? A storage account gives your applications access to Windows Azure Blob, T ...
- 【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题
问题描述 当打开Azure存储账号(Storage Account)门户页面时,从 "访问控制(标识和访问管理)" 页面中发现有"拒绝分配"的功能,所以就思考, ...
- 【Azure 应用服务】Azure Function集成虚拟网络,设置被同在虚拟网络中的Storage Account触发,遇见Function无法触发的问题
一切为了安全,所有的云上资源如支持内网资源访问,则都可以加入虚拟网络 问题描述 使用Azure Function处理Storage Account中Blob 新增,更新,删除等情况.Storage A ...
- 【Azure 存储服务】Python模块(azure.cosmosdb.table)直接对表存储(Storage Account Table)做操作示例
什么是表存储 Azure 表存储是一项用于在云中存储结构化 NoSQL 数据的服务,通过无结构化的设计提供键/属性存储. 因为表存储无固定的数据结构要求,因此可以很容易地随着应用程序需求的发展使数据适 ...
- Azure China (4) 管理Azure China Storage Account
<Windows Azure Platform 系列文章目录> Update 2015-05-10 强烈建议使用AzCopy工具,AzCopy命令行工具,是经过优化的.高性能Azure S ...
- 【Azure Developer】使用 Python SDK连接Azure Storage Account, 计算Blob大小代码示例
问题描述 在微软云环境中,使用python SDK连接存储账号(Storage Account)需要计算Blob大小?虽然Azure提供了一个专用工具Azure Storage Explorer可以统 ...
- Azure 基础:Blob Storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 Table Storage 的基本 ...
- Azure 基础:Queue Storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 File Storage 的基本用 ...
- 【Azure Developer】解决Azure Key Vault管理Storage的示例代码在中国区Azure遇见的各种认证/授权问题 - C# Example Code
问题描述 使用Azure密钥保管库(Key Vault)来托管存储账号(Storage Account)密钥的示例中,从Github中下载的示例代码在中国区Azure运行时候会遇见各种认证和授权问题, ...
- Azure 基础:Table storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table.其中的 Table 就是本文的主角 Azure Tabl ...
随机推荐
- TCP内核参数的简单验证
前言 春节假期时学习了下内核参数与nginx的调优 最近因为同事遇到问题一直没有解,自己利用晚上时间再次进行验证. 这里将几个参数的理解和验证结果简单总结一下. 希望能够在学习的过程中将问题解决掉. ...
- Docker与虚拟化技术浅析第一弹之docker与Kubernetes
1 前言 Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的. 可移植的.自给自足的容器.开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机).ba ...
- 用webpack给js添加上版本号
在网上查找了很多的资料. 都没有好的资源 因为我现在在项目是vuecli3.0 需要自己去创建文件 在项目的根目录下,创建一个文件vue.config.js 然后在该文件下写 const webpac ...
- Jekyll安装
本文来自Jekyll官方文档. 简介 Jekyll是一个静态网站生成器,它可以把Markdown写就的文本根据指定的布局生成静态网站.你可以调整网站的外观.URL.页面展示数据等信息. 准备工作 Je ...
- 新来的一个同事,把SpringBoot参数校验玩的那叫一个优雅
介绍 在开发现代应用程序时,数据验证是确保用户输入的正确性和应用程序数据完整性的关键方面.Spring Boot 提供了强大的数据验证机制,使开发者能够轻松地执行验证操作.本文将深入介绍 Spring ...
- Python 封装zabbix-get接口
Zabbix 是一款强大的开源网管监控工具,该工具的客户端与服务端是分开的,我们可以直接使用自带的zabbix_get命令来实现拉取客户端上的各种数据,在本地组装参数并使用Popen开子线程执行该命令 ...
- 深入浅出Java多线程(八):volatile
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第八篇内容:volatile.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在当今的软件开发领域,多线程编程 ...
- MyBatis动态sql之foreach标签 构建 in 语句
<foreach> 元素主要用在构建 in 条件中,它可以在 SQL 语句中迭代一个集合.<foreach> 元素的属性主要有 item.index.collection.op ...
- Python-字符串format方法指定参数
一.字符串的format方法有几种指定参数的方式:(1)按照位置传参(默认方式),传入的参数与{}一一对应(2)关键字传参,关键字(keyword)传递是根据每个参数的名字传递参数.关键字并不用遵守位 ...
- Java并发编程-CompletableFuture(下)
大家好,我是小高先生,书接上文,我们继续来学习CompletableFuture.上文我们讲了基础装Future是如何升级为神装CompletableFuture以及如何购买CompletableFu ...