- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从系统设计/可扩展性的角度来看,在处理需要大量写入数据库中特定表的系统时,有哪些行业标准策略。
为简单起见,假设该表是产品的库存表,有一个“产品名称”列和一个“计数”列,并且每次将新产品购买到系统中时它只会增加 +1。并且每 2 日就有数百万用户购买不同的产品,我们必须跟踪每个产品的最新计数,但不必严格实时,也许 5 分钟的滞后是可以接受的。
我的选择是:
1) 主从复制,其中主数据库处理所有写入,从属处理读取。但这并没有解决写重的问题
2) 根据产品名称范围或其散列值对数据库进行分片。但是,如果某个特定产品(例如 Apple)在短时间内收到大量更新,它仍然会访问同一个 DB。
3)批量更新?使用某种缓存并每隔 X 秒写入一次表,并使用我们在这 X 秒内收到的任何内容的累积计数?这是一个有效的选项,我使用什么缓存机制?如果上次读取和下一次写入之间发生崩溃怎么办?如何恢复丢失的计数?
4)我忘记了任何其他明显的选择吗?
任何见解表示赞赏!
最佳答案
我想说一个解决方案将高度依赖于你到底需要做什么。每秒写入数千条记录的解决方案可能与您提供的示例中增加计数器的方法大不相同。更何况,可能没有 tables
完全可以处理这样的负载。 Consistency
/availability
您的问题中也缺少要求,并且取决于它们,整个架构可能会有很大不同。
无论如何,回到您特定的简单案例和您的选择
方案一(主从复制)
您将在这里面临的问题是数据库 locking
- 每个增量都需要一个记录锁以避免竞争条件,并且您将很快让您的进程写入您的数据库并在队列中等待并且您的系统关闭。即使在中等负载下)
选项 2(分片 DB)
你的假设是正确的,与 p.1 没有太大区别
选项 3(批量更新)
很接近。由提供并发的轻量级存储提供的缓存层 原子 使用 递增/递减坚持以免丢失您的数据。我们用过 redis
出于类似的目的,尽管任何其他 key-value database也可以——实际上有几十个这样的数据库。
A key-value database, or key-value store, is a data storage paradigm designed for storing, retrieving, and managing associative arrays, a data structure more commonly known today as a dictionary or hash table
incoming requests → your backend server -> kv_storage (atomic increment(product_id))
*/5
执行以下操作(简化):
product_id
在 kv_storage 阅读当前 value
+= value
) value
在 kv_storage 关于architecture - 系统设计 : Strategies for dealing with heavy writes to a DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037736/
关闭。这个问题需要更多focused 。它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 已关闭 7 年前。 Improve this qu
有很多问题会问“为什么我的并行循环比顺序循环慢”,答案是“循环内所需的工作很少;尝试进行更多迭代”,例如 this one . 我有一个循环,每次迭代大约需要 0.5 分钟。我认为这个循环足够“重”,
我有一个向数百万用户发送消息的系统。 我们的集群中有 6 个应用程序节点,具有一个通用的 Oracle 数据库 (RAC)。 在其中一个用例中,我们必须向用户发送消息,消息发送后,我们必须更新数据库表
我正在使用 C# 开发一个概念验证时间表应用程序,它允许用户简单地输入大量时间表记录。概念验证将使用 RavenDB 作为存储提供程序,但是下面的问题可能与一般的 nosql 概念更相关。 用户通常会
我目前正在设计一个数据库,其中有一个表 events,该表将插入(和更新)-heavy(我预计每分钟插入 1,000 到 5,000 次),但也需要按日期排序。 每个事件都有一个read bool 字
我最近一直在使用需要 PEAR 的 PHPUnit。我提到 PEAR 的每个 PHP 开发人员似乎都认为它是一大堆笨拙的代码。真相是什么?对我来说,PEAR 就像任何其他库一样,除非您决定包含和使用大
我正在研究使用 Qt 库编写一个自包含的 http 服务器,尽管许多人认为 QtCore 过于臃肿并且开销太大。 QtCore http 服务器是否会使用线程池管理大约 50 个并发连接的负载。 Qt
我正在修改 Windows 窗体以允许在 UI 保持响应时在后台加载数据。数据检索和绑定(bind)都需要相当长的时间。理想情况下,我会在后台执行这两项操作,但是对于我应该在后台执行哪种 UI 更新(
我有一个电子邮件队列,其中包含要发送的电子邮件。一个Web服务调用一个SOAP Web服务,该SOAP Web服务一个一个地处理队列。 我们使用外部供应商的REST API发送电子邮件。我的问题是,对
人们经常在他们的(与优化和性能相关的)问题和答案中谈论“重载”。 我试图在典型服务器上的常规 Web 应用程序的上下文中量化这一点(以 SO 及其相当小的基础设施为例),假设它们立即返回(以简化和提高
我正在编写将在AWS EMR上运行的mapreduce程序。 我的程序从google ngram语料库中计算出概率。 我想知道运行一次可同时处理所有计算的mapreduce和一次处理一次计算的多个ma
我们的 Jenkins 上运行着不同的作业。有些工作很繁重,需要占用大量 CPU 和 RAM,有些则不然。所以我想要一些插件来帮助我设置这些作业的权重,就像https://wiki.jenkins-c
我更担心 OOM 在 ListView 的每个项目上都有繁重的 UI,例如我有 100 个项目。下面是我想要练习和复制 UI 布局的图像。可能的布局是什么或者我如何实现这种类型的 UI。每个项目都可以
我发现一些类(“重类”)不应该重复创建和处置,因为它占用了 JVM 的开销/时间/资源。虽然可以想象什么是重级 - 我从未遇到过它的任何定义。 背景: 重复创建和处置 SimpleDateFormat
从很多文档中,我了解到岭回归的秘诀是: loss_Ridge = loss_function + lambda x L2 norm of slope Lasso 回归的秘诀是: loss_Lasso
所以我构建了这个类似邮件程序的 HTML 查看器(没有真正的电子邮件,只是用户之间的一些消息)。它基本上就像 Windows 资源管理器一样,在顶部有标签,文件可以按日期或字母顺序排序。每条消息如下所
我正在我的 android 应用程序中进行一些繁重的计算。因为我不想阻塞 UI 线程,所以我在一个单独的 WorkerThread 中进行计算,它扩展了 Thread。这很好用。但我无法停止线程。停止
我有一个带有 cells 的 table view,当执行左滑 Action 时它们可以显示一个复选标记(复选标记只是一个 UIView,哪个属性 isHidden 被设置为 true)。 我在另一个
我正在开发一个程序,该程序可以播放一系列 Clip (clip.start()),平均每秒一个。 意味着一个剪辑开始,一秒钟后停止,另一个剪辑开始,依此类推,大约 10 个剪辑。 结果并不“流畅”,有
我已经知道,当我将一个成员函数的定义放在一个头文件中并将该函数标记为inline时,该函数中的代码将被内联到该函数被调用的任何地方.cpp 文件,所以当涉及到编译的二进制文件时,我知道函数的代码位于何
我是一名优秀的程序员,十分优秀!