Azure Cosmos DB (Microsoft的云规模分布式数据库)旨在提供应用程序所需的API和存储模型。 需要NoSQL数据库吗? 使用MongoDB或Cassandra API。 需要使用图查询吗? 使用Gremlin API。 Azure自己的表存储API? 他们也在那里。 甚至可以选择使用SQL 。
但这仅仅是Cosmos DB的外部,它与应用程序其余部分的连接。 在许多情况下,您需要添加更多代码来管理数据并在数据库内部提供基本处理。 传统数据库提供存储过程和触发器来管理此过程,并在数据附近运行服务器端代码。
不足为奇的是Cosmos DB支持服务器端代码,并带有一组内置JavaScript API ,这些API在数据库中运行事务代码,就像SQL Server存储过程一样。 但是,构建和运行这些存储过程的方法大不相同,需要进行一些考虑。 您不再需要使用一台服务器(或最多只有一个小型本地集群)上的一个数据库。 现在,您正在使用可能分布在各个洲之间的分布式商店,并使用新的一致性模型。 这些模型比最终的一致性更具可预测性,但没有提供强一致性模型所需的锁定。
Cosmos DB存储过程的核心是其集成JavaScript查询API。 过程可以访问标准数据库操作,以创建新项目以及读取,更新,删除和查询现有项目。 它们在Cosmos DB容器内工作,并已注册到数据库中的特定集合。
构建Cosmos DB JavaScript很容易。 就像在任何服务器端JavaScript环境中工作一样,因此您可以将现有技能带到Cosmos DB开发中。 您的代码将需要使用getContext()
函数创建上下文对象,因为这使您可以访问数据库以及任何可用的操作,包括请求和响应。 特定于Cosmos DB的代码约束将要求您集中精力编写服务器端代码。 存储过程和触发器代码在Cosmos DB存储容器的主副本中运行; 用户定义的函数查询在主副本和辅助副本上运行。
JavaScript Query API可以与Cosmos DB的SQL API一起使用,也可以与自己的一组函数调用一起使用 。 JavaScript API使用函数来托管查询,处理存储的JSON文档和Cosmos DB的索引。 您可以像熟悉的SQL命令一样对待filter()
和map()
类的函数,而filter()
像WHERE
一样运行,而map()
像SELECT
。 如果您将Microsoft的Linq内联查询语言与C#结合使用,则会发现查询API的工作方式类似。 如果您喜欢使用SQL,则可以像其他任何SQL查询一样编写查询:在JavaScript中定义为字符串,并作为对容器中文档的查询调用的一部分传递给Cosmos DB。
重要的是要记住,Cosmos DB是一个分布式数据库,它将管理多个实例和容器中的数据,因此您会发现所有数据操作都是异步的,利用了服务器响应JavaScript回调。 您的回调应包含错误处理代码,否则错误将触发Cosmos DB自身的错误处理功能。 还有另一个重要的考虑因素:Cosmos DB强制执行超时,如果过程花费的时间太长,它将被视为失败,并且数据库将回滚事务。
存储过程是作为JavaScript函数构建的 ,并且要插入数据库中的项目将作为包含JSON内容的字符串传递给该函数。 您将需要解析JSON以获取其他数据类型,例如数组内容。 JavaScript可以轻松处理JSON,并且请求字符串内容映射为JavaScript类型。
一旦存储过程被编写并安装到数据库中,就可以像其他Cosmos DB函数一样从应用程序中调用它们。 您将首先注册该过程,然后通过构造适当的URI并将其传递给JSON来调用它。 请求主体将需要一个分区键,因为存储过程的作用域是特定的分区键。 将数据写入数据库后,将使用您选择的一致性模型进行复制。
Cosmos DB支持触发器 ,包括触发前和触发后。 在修改项目之前,您的应用程序将使用预触发; 后触发将随后运行。 预触发的一种用途是在将项目写入Cosmos DB之前对其进行验证:检查输入是否在范围之内,或者在初始操作中不存在时添加期望的信息。 您不会将参数传递给触发器,因为您所做的只是处理请求对象的内容。 类似地,后触发也可以从已修改的对象中获取数据,并使用它来更新Cosmos DB存储中的元数据或其他文档。
使用JavaScript查询API和getContext()
函数以类似于存储过程的方式编写触发器。 像使用JavaScript API的所有操作一样,Cosmos DB触发器是事务性的。 后触发中的错误将回滚当前事务,从而生成Cosmos DB异常。 预触发失败将意味着当前操作不会对数据库进行任何更改。
服务器端代码的另一个选项是用户定义的函数 ,这是一种使用可重用代码段的方法,该代码段可以添加到Cosmos DB数据库中,然后由触发器或存储过程调用。 一种典型的用途是用于通用计算,其中根据功能结果存储其他数据,例如使用里程津贴和费用规则,或计算要添加到购买中的营业税。
Cosmos DB是功能强大的工具,向其添加代码使它变得更加有用。 如果将它与Web或移动应用程序一起使用,则将计算卸载到数据库是有意义的,尤其是当您将计算的数据添加到文档或存储请求的元数据时。 代码不需要很复杂,但是如果您没有使用内联查询语言(例如.Net的Linq),那么与Cosmos DB的上下文模型配合使用可能会花费一些工作。
From: https://www.infoworld.com/article/3391386/writing-server-side-code-in-azure-cosmos-db.html