商业项目中的数据库:怎么办?

所有的假期都结束了!...有些人会说这恭喜。 但是,可以肯定的是,许多人很快就会放假,所以多花点时间。 好吧,我们并没有失去动力,在这个温暖的日子里,我们分享了合作伙伴的经验。 这将与优化数据库工作有关。 削减更多细节!



我请作者发言。

哈勃的读者,我们欢迎您! 我们是WaveAccess团队,在本文中,我们将与您分享在商业项目中使用Azure Cosmos DB数据库服务(DB)的经验。 我们将告诉您为什么要使用数据库,以及开发过程中必须面对的细微差别。

什么是Azure Cosmos DB


Azure Cosmos DB是作为PaaS解决方案提供的具有多模型范例的商业性,全球分布式数据库服务。 她是下一代Azure DocumentDB。

该数据库由Microsoft在2017年开发,由计算机科学博士学位的Leslie Lamport参与(2013年因对分布式系统理论做出了重要贡献的图灵奖获得者,LaTex开发人员,TLA +规范的创建者)。

Azure Cosmos DB的主要特征是:

  • 非关系数据库;
  • 其中的文档以JSON格式存储;
  • 水平缩放并选择地理区域;



  • 多模型数据范例:键值,文档,图形,列族;
  • 99%的请求具有低延迟:读操作少于10毫秒,(索引)写操作少于15毫秒;
  • 专为高吞吐量而设计;
  • 它以99.999%的SLA级别保证可用性,数据一致性和延迟。
  • 可配置的带宽
  • 自动复制(主从);
  • 自动索引数据;
  • 可定制的数据一致性级别。 5个不同级别 (强,有界的陈旧性,会话,一致的前缀,最终);

在图形上,您可以看到各种一致性级别对数据可用性,性能和一致性的依赖性。



  • 为了方便地从其数据库过渡到Cosmos DB,有许多用于访问数据的API:SQL,JavaScript,Gremlin,MongoDB,Cassandra,Azure Blob;
  • 可定制的防火墙;
  • 自定义数据库大小。

我们解决的任务


每隔N秒钟,全世界有成千上万的传感器发送信息(以下称为通知)。 这些通知必须存储在数据库中,然后搜索它们并将其显示在系统操作员的UI中。

客户要求:

  • 使用Microsoft技术堆栈,包括Azure云;
  • 每秒处理100个请求的吞吐量;
  • 通知的结构不明确,可能会进一步扩展;
  • 对于紧急通知,处理速度很重要;
  • 高系统弹性。

根据客户需求,理想情况下是使用非关系,全球分布,可靠的商业数据库来访问我们。



如果我们查看与Cosmos DB类似的数据库,我们可以回想起Amazon DynamoDB,Google Cloud Spanner。 但是Amazon DynamoDB并不是全球分布的,并且Google Cloud Spanner的一致性和数据模型类型(仅表格形式,关系形式)的级别较低。

由于这些原因,我们选择了Azure Cosmos DB。 为了与数据库进行交互,我们使用了.NET的Azure Cosmos DB SDK ,因为后端是用.NET编写的。

我们遇到的细微差别


1.数据库管理

为了开始使用数据库,首先,您需要选择一种工具来管理它。 我们在Azure门户和DocumentDbExplorer中使用了Azure Cosmos DB Data Explorer。 还有一个Azure Storage Explorer实用程序。



2.设置数据库集合

在Cosmos DB中,每个数据库都由集合和文档组成。

可定制的收集功能,请注意:

  • 集合大小:固定或无限;
  • 带宽,以请求单位每秒RU / s(从400RU / s起);



  • 索引策略(包括或不包括往返索引的文档和路径,设置各种类型的索引,设置索引更新模式)。

典型索引示例

{ "id": "datas", "indexingPolicy": { "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*", "indexes": [ { "kind": "Range", "dataType": "Number", "precision": -1 }, { "kind": "Hash", "dataType": "String" }, { "kind": "Spatial", "dataType": "Point" } ] } ], "excludedPaths": [] } } 

为了使子字符串搜索有效,对于字符串字段,您需要使用哈希索引(“ kind”:“ Hash”)。

3.数据库事务

事务是在数据库中以存储过程级别实现的(执行存储过程是原子操作)。 JavaScript存储过程

 var helloWorldStoredProc = { id: "helloWorld", body: function () { var context = getContext(); var response = context.getResponse(); response.setBody("Hello, World"); } } 

4.数据库变更渠道

更改Feed侦听集合中的更改。 更改收集文档时,数据库将向该频道的所有订户引发有关更改的事件。

我们使用Change Feed来跟踪集合更改。 创建通道时,必须首先创建一个辅助AUX集合,该集合可协调多个工作角色对更改通道的处理。

5.数据库限制:

  • 缺乏批量操作(用于批量删除 ,更新文档的存储过程);
  • 缺乏文件的部分更新;
  • 没有跳过操作(实现分页的复杂性)。 为了在通知请求中实现分页,我们使用了RequestContinuation (作为发出结果链接到最后一个元素)和MaxItemCount (从数据库返回的元素数)。 默认情况下,结果将分批返回(每个程序包中不超过100个项目,并且不超过1 MB)。 可以使用MaxItemCount参数将返回的项目数增加到1000。

6.处理第429个数据库错误

当收集带宽达到最大时,数据库开始生成“ 429 Too Many Request”错误。 要对其进行处理,可以使用SDK中的RetryOptions设置,其中MaxRetryAttemptsOnThrottledRequests是完成请求的尝试次数,而MaxRetryWaitTimeInSeconds是连接尝试的总时间。

7.预测使用数据库的成本

为了预测使用数据库的成本,我们使用了在线计算器 RU / s。 在基本计划中,一个1 KB元素的请求单元通过指向其自身或该元素标识符的链接对应于一个简单的GET命令。

结论


Azure Cosmos DB易于使用,可通过Azure门户轻松灵活地进行配置。 许多数据访问API使得迁移到Cosmos DB变得很容易。 无需聘请数据库管理员来维护数据库。 SLA财务担保,全球水平扩展使该数据库在市场上非常具有吸引力。 它适用于对容错和带宽有高要求的企业和全球应用。 我们在WaveAccess继续在我们的项目中使用Cosmos DB。

关于作者


WaveAccess团队为世界各地的公司创建了技术先进,负载高,容错的软件。 WaveAccess软件开发高级副总裁Alexander Azarov表示:

乍一看,困难的任务可以通过相对简单的方法解决。 重要的是不仅要学习新工具,而且还要完善熟悉技术的知识。

公司博客

Source: https://habr.com/ru/post/zh-CN413757/


All Articles