【问题标题】:Implementing warehousing system using rethinkdb: are there any strictly ACID requirements I need?使用 rethinkdb 实施仓储系统:我需要严格的 ACID 要求吗?
【发布时间】:2016-04-14 19:42:49
【问题描述】:

情况

我正在尝试使用传统数据库实现仓库系统。

表格是:

  1. 产品(每行代表 1 个 sku)
  2. warehouse_locations(每一行代表特定仓库中的特定货架)
  3. 托盘(每行代表一个特定托盘)
  4. user_defined_categories(每一行代表一个特定的用户定义类别:例如 reserved、available、total_physical 等)
  5. products_in_pallets_by_categories(每一行都有pallets、products和user_defined_categories表的外键。将指定特定类别的特定托盘中的产品数量。)
  6. products_in_warehouse_locations_by_categories(每一行都有warehouse_locations、products表和user_defined_categories的外键。将指定特定类别的特定托盘中的产品数量。)

最终用户希望看到/做什么

最终用户将更新系统,了解哪些产品在哪个托盘上放置/移除。

最终用户还希望随时(最好实时)了解仓库中有多少保留或可用产品。

那么我最初的计划是什么?

希望使用 PostgresQL 等传统 RDBMS 和 RabbitMQ 等消息队列来提供实时更新。实时更新是指使用单页应用程序或手机的最终用户可以实时观察库存变化。

那么发生了什么变化?

I came across rethinkdb FAQ 它说

如果您需要完整的 ACID 支持或强大的功能,RethinkDB 不是一个好的选择 模式强制——在这种情况下,你最好使用关系 数据库,例如 MySQL 或 PostgreSQL。

你为什么还要考虑 rethinkdb?

因为如果我可以使用它并且它允许实时更新,它将非常有帮助,因为我们希望客户的销售团队在我们的系统上进行世界各地的预订。

最频繁的更新/插入是什么?

产品从一个地方到另一个地方的移动。我希望对关系表进行大量更新/插入/删除。偶尔,我很抱歉,我不知道如何在 rethinkdb 范式中解释这一点。我是一个传统的 RDBMS 人。

系统建好了吗?

还没有。这就是为什么我想在实际继续之前寻求有关 rethinkdb 的答案。

您希望使用任何交易吗?

嗯,我不确定。

我可以想象一个真实的案例,仓库工人将产品(部分或全部)从一个托盘移动到另一个托盘。

另一个现实世界的案例是仓库工人将产品从托盘移动到仓库位置(反之亦然)。

我一定要使用交易吗?同样,我不确定。

因为我希望工人在搬完搬家后更新系统。

我会提供一个屏幕供他们选择

  • <some dropdown> 移动到<another dropdown>

那么问题是什么?

目前我是否需要根据我的用户要求为我的仓库系统提供完整的 ACID 支持或强大的架构实施?使用 rethinkdb 可以实现吗?

我还希望在系统实施后实施 activity streams,该系统将显示诸如工人 A 将 100 件产品 A 从仓库货架 1A 移动到托盘 25 等事件。

【问题讨论】:

  • 关系数据库用于执行“大量更新/插入/删除”,这就是它们的用途。为什么你认为 Postgres 不能做到这一点?
  • 嗨,Kim,虽然我认为这个问题更像是一个面向哲学/讨论的查询,但您绝对应该查看分布式系统专家 Aphyr 的这篇文章 => aphyr.com/posts/329-jepsen-rethinkdb-2-1-5。 RethinkDB 不会强调“最终一致”,使用正确的标志来进行 hard 持久性和 majority 读取,您将使用 RethinkDB 获得相当一致(并且可靠验证)的设置。
  • 感谢@dalanmiller 的链接你自己真的重新思考过吗?

标签: postgresql database-design rethinkdb


【解决方案1】:

当您处理信息必须始终准确和一致的事情时,ACID 很重要。从你说的情况来看,这听起来很重要。

在我看来,您只想允许实时更新,关键问题在于将 rabbit-mq 视为非实时组件,对吗?你为什么还要考虑 RabbitMQ? (如果是为了让db宕机维护,也许在sqlite中实现一个备份私有缓存存储?)

一般来说,您应该假设您需要 ACID 合规性,直到您拥有最终一致性可以接受的模型。此外,实时准确的报告排除了最终的一致性。

【讨论】:

  • 我做了更多的研究。有一种叫做 2 Phase Commits 的东西,可以通过 rethink 和其他类似的 NoSQL 技术实现。使用 2 Phase Commit 是您所谓的最终一致性吗?实时更新是指使用单页应用程序或手机的最终用户可以实时观察库存变化。为那个道歉。
  • 您询问了 ACID 合规性。 2PC 是用于在分布式系统中强制一致性的东西。换句话说,对于 2PC,您询问所有系统是否可以提交,然后提交。那时,提交是有保证的。 PostgreSQL 也有 2PC。然而,这两种考虑在理论上是不同的,因为 2PC 没有将一致性模型指定为概念,而 ACID 也没有指定提交模型。
  • 感谢您教我 postgres 也使用 2PC。我不知道。至于一致性模型,有什么例子吗?我试过谷歌搜索,但维基百科的答案对我来说有点迟钝。您在理论上提到 ACID 和 2PC 是不同的。这是否意味着在实践中,特别是就我的情况而言,2PC 是“足够符合 ACID 的”?
  • ACID 是系统一致性的一种定义。例如,BASE 是一个不同的模型。 2PC 是您管理多个系统之间的集成的方式,这样您就可以对数据已交付到两个端点有一些基本的保证。这篇文章出奇的好:neo4j.com/blog/acid-vs-base-consistency-models-explained
猜你喜欢
  • 2015-10-02
  • 2015-05-07
  • 2010-10-03
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多