专栏首页MongoDB中文社区使用模式构建:近似值模式

使用模式构建:近似值模式

在MongoDB中文社区学习更多关于MongoDB的知识和技能

假设现在有一个相当规模的城市,大约有3.9万人。人口的确切数字是相当不稳定的,人们会搬入搬出、有婴儿会出生、有人会死亡。我们也许要花上整天的时间来得到每天确切的居民数量。但在大多数情况下,39,000这个数字已经“足够好”了。同样,在许多我们开发的应用程序中,知道“足够好”程度的数字就可以了。如果一个“足够好”的数字就够了,那么这就是一个应用近似值模式的好机会。

近似值模式

在所需要的计算非常有挑战性或消耗的资源昂贵(时间、内存、CPU周期)时,如果精度不是首要考虑因素时,那么我们就可以使用近似值模式。再回顾一下人口问题,精确计算这个数字的成本是多少?从我开始计算起,它将会改变还是可能会改变?如果这个数字被报告为39,000,而实际上是39,012,这会对这个城市的规划战略产生什么影响?

从应用程序的角度看,我们可以构建一个近似因子,它允许对数据库进行更少写入的同时仍然提供统计上有效的数字。例如,假设我们的城市规划是基于每10000人需要一台消防车,那么用100人作为这个计划的“更新”周期看起来就不错。“我们正接近下一个阈值了,最好现在开始做预算吧。”

在应用程序中,我们不需要每次更改都去更新数据库中的人口数。我们可以构建一个计数器,只在每达到100的时候才去更新数据库,这样只用原来1%的时间。在这个例子里,我们的写操作显著减少了99%。还有一种做法是创建一个返回随机数的函数。比如该函数返回一个0到100之间的数字,它在大约1%的时间会返回0。当这个条件满足时,我们就把计数器增加100。

我们为什么需要关心这个?当数据量很大或用户量很多时,对写操作性能的影响也会变得很明显。规模越大,影响也越大,而当数据有一定规模时,这通常是你最需要关心的。通过减少写操作以及不必要的“完美”,可以极大地提高性能。

应用场景示例

人口统计的方式是近似值模式的一个示例。另一个可以应用此模式的用例是网站视图。一般来说,知道访问过该网站的人数是700,000还是699,983并不重要。因此,我们可以在应用程序中构建一个计数器,并在满足阈值时再更新数据库。

这可能会极大地降低网站的性能。在关键业务数据的写入上花费时间和资源才是有意义的,而把它们全部花在一个页面计数器上似乎并不是对资源很好的利用。

电影网站 – 写操作负载降低

在上图中,我们看到了如何使用近似值模式,这不仅可以减少计数操作的写入,还可以通过减少这些写入来降低架构的复杂性和开销。这可以带来更多的收益,而不仅仅是写操作时间的减少。与前面讨论过的计算模式(The Computed Pattern)类似,它通过降低计算的频率,从而在总体上节约了CPU的使用。

结论

近似值模式对于处理难以计算和/或计算成本高昂的数据,并且这些数字的精确度不太关键的应用程序是一个很好的解决方案。我们可以减少对数据库的写入,从而提高性能,并且保持数字仍然在统计上是有效的。然而,使用这种模式的代价是精确的数字无法被表示出来,并且必须在应用程序本身中实现。

牟天垒

野生程序员一枚。长期关注分布式系统及通用型数据库技术。

本文分享自微信公众号 - Mongoing中文社区(mongoing-mongoing)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Confluence 6 计划你的升级

    使用下面的表格来确定最佳的升级路径来让你的Confluence 从当前版本升级到最新的 Confluence 版本。

    HoneyMoose
  • 大数据 | SparkSQL连接查询中的谓词下推处理(二)

    在《SparkSql连接查询中的谓词下推处理(一)》中,我们介绍了一些基本的概念,并对内连接查询时的一些基本下推规则进行了分析。

    杨振涛
  • 好雨云帮每周更新日志(2017.02.27-2017.03.12)

    Rainbond开源
  • 简析 Jenkins 专有用户数据库加密算法

    其中,安全域可以采用三种形式,分别为:Jenkins 专有用户数据库、LDAP、Servlet 容器代理。

    LinuxSuRen
  • Reviewboard时区问题 原

    在创建ReviewBoard站点后发现,Reviewboard时区默认为UTC(服务器时区为+8区,即东八区)

    donghui
  • Rainbond 5.1.3发布,快速部署和运维spring cloud集群

    今天为大家带来Rainbond 5.1系列第三个更新版本,本次版本更新的关键是降低Rainbond学习门槛,我们不仅增加了新用户指导任务来指引用户学习Rainb...

    Rainbond开源
  • Confluence 6 在升级之前

    在这个指南中,我们将会与你一同对最新的 Confluence 站点在 Windows 或者 Linux 平台进行安装和更新。

    HoneyMoose
  • 开源Rainbond发布v3.4.2更新:应用插件体系进入beta版本

    3、 页面刷新后会在当前租户当前数据中心自动安装上两个Rainbond提供的插件

    Rainbond开源
  • Confluence 6 升级以后

    如果你现在使用的是 Oracle 或者 MySQL 数据库的话,你讲要重新拷贝 jdbc 驱动的 jar 文件到你已经存在的 Confluence 安装目录中 ...

    HoneyMoose
  • 【Rainbond最佳实践】Spring Boot框架配置MySQL

    Spring Boot框架简化了新Spring应用的初始搭建以及开发过程,云帮支持平台部署Spring Boot类应用。

    Rainbond开源

扫码关注云+社区

领取腾讯云代金券