- 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/
在大多数示例中,策略模式通常适用于压缩算法/编解码器算法,其中这些算法可能具有完全不同的代码。 但是,在我的例子中,我想重构为策略模式的统计算法有 50% 的代码相似或完全相同。我想知道人们如何处理这
git merge选项有什么区别--strategy-option(短-X)和--strategy(短-s)? 有很多关于 merge strategies 的问题.但是没有人解释这些选项之间的区别。
耦合策略和非耦合策略有什么区别? 谢谢回答。 最佳答案 当策略类知道上下文时,或者当客户端知道策略具体类时,策略是耦合的。 我们可以阅读 here (有一些小的修改): Usually each st
我是 hibernate 新手。我不明白以下两种主键生成策略: 身份 顺序 有人能解释一下这两者是如何工作的吗?这两者有什么区别? 最佳答案 引用 Java Persistence/Identity
我正在尝试调试我在编写内核时遇到的链接器问题。 问题是我有一个变量 SCAN_CODE_MAPPING我无法使用 - 它似乎是空的或其他东西。我可以通过改变我链接程序的方式来解决这个问题,但我不知道为
今天,当我找到一种方法来破坏我们程序中的某些功能时,我正在为客户做一些事情。 (代码实际上是遗留代码,它已经开发了大约 10 年,而我在这里只工作了大约一年。) 它不会导致错误或导致程序崩溃,但如果用
我想使用 Strategy Pattern为第三方类中的成员实现一些定制的格式化行为。我希望第三方只需注释类成员以指示他们是否应该使用格式策略(A、B 或 C),然后使用他们类的实例调用我的“格式”函
我试图将 CopyOnWriteArrayList 理解为我的代码: 我的代码是: public class AuditService { private CopyOnWriteArrayLi
在 git 中,我有一个 master 分支,我在其中开发我的应用程序。除了应用程序,我还需要开发它的演示版本。 我考虑过为 demo 创建一个永远不会 merge 到 master 中的单独分支。主
1、意图 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法 2、策略模式结构图 3、策略模式中主要
抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法。 具体策略(Concre
模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行 模板模式属于行为型模式 摘要 1、
我希望这是一个可以接受的问题。我理解递归的思维模式,我想考虑基本情况,然后是递归情况,但是对于一些更困难的 BST 问题,我只是画了空白,感觉就像我迷失了方向而没有一个好的方向。 例如,对于链表,似乎
是否有人考虑过为 Azure 存储队列实现策略,允许以任意顺序(除了先进先出)使消息出队。例如,有些人可能对 LIFO 感兴趣,有些人可能希望在不太重要的消息之前将“重要”消息出队,等等。 就我个人而
虽然多线程在某些情况下速度更快,但有时我们只想生成多个工作进程来完成工作。这样做的好处是,如果其中一个 worker 崩溃,主应用程序不会崩溃,而且用户不需要太担心互锁问题。 COM+ 的 Appli
我的应用程序将对我的对象有不同的策略。实现这一目标的最佳方法是什么?理想情况下,我想从某些关系数据库动态加载策略实现。但我不知道该怎么做。最好的方法是什么? 例如,假设我们要将策略 Strategy1
上下文 首先,感谢您的假设。它既非常强大又非常有用! 我编写了一个假设策略来生成以下形式的单调(ANDS 和 OR)策略表达式: (A and (B or C)) 这可以被认为是一个树结构,其中 A、
问题 我有一个大类(大约 1500 LOC),它使用不同的“策略”将数据从一个对象转换到另一个对象。我在这里有那个类的表示: public class FooService implements Fo
我正在阅读 Effective Java。在讨论使用函数对象作为策略的部分中,存在以下段落。 Because the strategy interface serves as a type for a
我是 C# 4.0 和 WPF 的新手,我正准备开始一个新的应用程序。 来自 C++/MFC 世界,我对测试与最新技术一起使用的策略很感兴趣。 例如: 单元测试 功能测试 界面测试 其他? 如有任何建
我是一名优秀的程序员,十分优秀!