Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用azure函数的数据访问层模式_Azure_Design Patterns_Azure Functions_Data Access Layer - Fatal编程技术网

使用azure函数的数据访问层模式

使用azure函数的数据访问层模式,azure,design-patterns,azure-functions,data-access-layer,Azure,Design Patterns,Azure Functions,Data Access Layer,我们目前正在开发一种使用Azure函数和Azure存储队列绑定的设计。 队列中的每条消息表示一个完整的事务。Azure函数将绑定到该队列,以便在队列中有新消息时立即触发该函数。 然后,该函数将在SQL数据库中提交事务 第一次cut实施也已完成;它工作得很好。然而,回顾过去,我们正在考虑以下事项: 在典型的DAL中,有使用实体框架、存储库模式等的成熟设计模式。但是,在无服务器代码中实现DAL时,我们没有找到类似的指导/最佳实践。 因此,我的问题是:这样的模式应该用Azure函数实现(这将是一个挑战

我们目前正在开发一种使用Azure函数和Azure存储队列绑定的设计。 队列中的每条消息表示一个完整的事务。Azure函数将绑定到该队列,以便在队列中有新消息时立即触发该函数。 然后,该函数将在SQL数据库中提交事务

第一次cut实施也已完成;它工作得很好。然而,回顾过去,我们正在考虑以下事项: 在典型的DAL中,有使用实体框架、存储库模式等的成熟设计模式。但是,在无服务器代码中实现DAL时,我们没有找到类似的指导/最佳实践。
因此,我的问题是:这样的模式应该用Azure函数实现(这将是一个挑战:),还是应该尽可能简化无服务器代码,或者这根本不是Azure函数的用例?

不需要太特殊。我们正在为各种事情使用一组例行的库DLL——数据库、与Azure的其他部分交互(如检索连接字符串的关键Vault机密)、解析文件上载、业务规则等等。这些库的目标是netstandard20,因此当正确的触发器可用时,我们可以更轻松地迁移到函数v2

主要是设计您的库,使它们高度模块化,这样您就可以最大限度地减少完成工作所需的负载(假设在系统的其他领域重用很重要,这通常是很重要的)

如果依赖注入在今天可用,它将变得更容易。在获得官方DI支持之前,我们中的一些人已经将其黑客化。(DI在功能路线图上,我相信是3.0版本。)

起初,我有点担心库方法的启动时间,但底层WebJobs堆栈本身已经相当繁重,而且函数启动性能似乎差异很大(至少在较便宜的层上)。在测试过程中,我们的一个不常执行的函数从大约300毫秒到大约3800毫秒的峰值不等,用于解析完全相同的测试文件,启动时只需大约55毫秒)

这些模式是否应该通过Azure函数实现(这将 具有挑战性:)),还是应该保持无服务器代码的轻量级 或者这根本不是azure功能的用例

我的答案是否定的。 应该有一些模式可以遵循,但传统的存储库模式和CRUD操作在云时代似乎并不有效。 我们从小就被培养出来要坚持的许多强有力的观念,这些天都变得无效了。 对数据库进行非规范化不仅可以接受,而且更可取

现在,设计模式将取决于为解决方案选择的数据库,还取决于应用程序的类型和数据的类型

这是一个链接,当您这样做时,它提供了一般指南

您的应用程序读重还是写重?设计也会相应变化。 您使用的是Azure Tables还是Mongo?有基于此的设计决策。索引在Mongo中很重要,而在Azure表中则可以执行非索引操作

切分考虑。 冗余考虑

在现代开发/架构中,许多原则已经改变,每个微服务都有自己的数据库,可能与任何其他微服务完全不同

如果你仔细阅读我提供的指南,你就会明白我的意思

将您的表格服务解决方案设计为高效阅读:

设计用于高读应用程序中的查询。在设计表时,在考虑如何更新实体之前,先考虑将要执行的查询(尤其是对延迟敏感的查询)。这通常会产生一个高效、高性能的解决方案。 在查询中同时指定PartitionKey和RowKey。像这样的点查询是最有效的表服务查询。 考虑存储实体的重复副本。表存储很便宜,所以考虑多次存储同一个实体(用不同的密钥)来实现更高效的查询。 <强>考虑对数据进行非规范化处理。<强>表存储很便宜,请考虑对数据进行非规范化处理。例如,存储摘要实体,以便对聚合数据的查询只需要访问单个实体。 使用复合键值。您仅有的键是PartitionKey和RowKey。例如,使用复合键值启用实体的备用键控访问路径。 使用查询投影。通过使用只选择所需字段的查询,可以减少通过网络传输的数据量。 将表服务解决方案设计为高效写:

不要创建热分区。选择使您能够在任何时间点将请求分散到多个分区的键。 避免交通堵塞。在一段合理的时间内保持交通畅通,避免交通堵塞。 不必为每种类型的实体创建单独的表。当您需要跨实体类型的原子事务时,可以将这些多个实体类型存储在同一个表的同一分区中。 考虑您必须达到的最大吞吐量。您必须了解表服务的可伸缩性目标,并确保您的设计不会导致超出这些目标


另一个好的来源是:

为什么熟悉的模式很难使用?如果您使用的是C#预编译函数,那么您应该能够做到这一点,在配置和版本控制方面有一些细微差别。