【问题标题】:Ensuring database consistency确保数据库一致性
【发布时间】:2012-03-21 02:44:17
【问题描述】:

如果我有一个最终一致的分布式数据库,如果我有一个网站,我正在销售产品并且我正在更改商品的价格,会发生什么情况?

如果产品的价格为 X,而我将其更新为价格 Y,则某些版本的数据库可能仍显示价格 X。如果客户结账,是否有策略确保他们实际上是最新的价格,这样他们就不会被收取不正确的价格?

在某些时候,我不需要对数据进行一些完整性检查以确保使用的是最新的值吗?

【问题讨论】:

  • 您是否使用第二个副本数据库进行负载平衡?
  • @DanKanze,是的,副本将用于负载平衡
  • @DanKanze 另一种可能性是数据库将用于本地化。因此,例如,如果我从位置 X 登录,我将访问离我很近的数据库。
  • 这不是一致性定义中描述的吗?我看了wiki,发现你的问题是数据库系统技术的典型情况。我对 dbs 了解不多,但我知道这是许多数据库所致力于的,在生产中,它与架构有关。
  • @Reorx 最终一致性是一种模型,其中并非所有数据库副本都保证在给定时间是最新的。所以我想知道在使用最终一致的模型时如何解决这个问题。

标签: database replication eventual-consistency


【解决方案1】:

我们曾经有一个自定义脚本来跟踪复制滞后,但那是几年前的事了。从那以后,我们就搬到了Percona Toolkit提供的心跳监控。

您可能还想考虑将他们选择的产品添加到他们的会话中,因此如果在他们结帐前价格发生变化,他们就不会感到震惊。

【讨论】:

  • @MikePurcell,您能否详细说明“考虑将他们选择的产品添加到他们的会话中,所以如果价格确实发生变化......”的意思。如何验证价格是否真的发生了变化?我可以尝试验证数据是否过时(可能使用您上面提到的工具包之类的工具),然后如果它过时,请向大师咨询正确的值?这是你的建议吗?
  • 关闭,我建议您尝试通过心跳监视器(以及可以使用的任何其他方法)尽可能显示最新的价格,但是当用户选择要购买的产品,通过将其添加到当前会话中及时冻结该产品的价格。这样,无论如何,用户的价格都是一致的,如果他们从购物车(会话)中删除商品,您可以强制刷新页面以显示最新价格,以防他们再次选择它。跨度>
  • 有道理。但是,假设我将产品放入购物车,价格为 1 美元。现在网站所有者意识到价格应该是 10 美元。当我去结账时,我应该被告知价格是 10 美元,而不是 1 美元。你的解决方案能解决这个问题吗?
  • 另一种选择是使用 2 个数据库 - 在本例中一个用于产品价格。该数据库将保证一致性。由于该数据库的写入次数相对较少,因此性能损失应该不会太大。然后一个数据库可以拥有可以容忍最终一致性的数据,例如产品描述。只是一个想法。显然我需要做一些测试,看看我的瓶颈在哪里,等等。
  • 价格从 1 美元变为 10 美元是一个明显的问题,老实说,我会改变用户的价格,即使是在会话中期。我想这归结为对价格变化的容忍程度。将价格调整 1-2% 是否值得失去潜在客户?
【解决方案2】:

您的数据库应该有一个价格、下一个价格以及价格生效的日期/时间。然后在用户指示订单时检查交易的时间戳。然后,您应该将该价格与交易一起存储,从那时起对该购买生效。

更好的是,为商品/价格组合创建一个唯一标识符并在您显示目录时将其记录下来 - 这样与您提供给他们的内容相比,不会有任何意外。 (当然有一些合理的超时来防止滥用。)

【讨论】:

  • @ledorfier,我不确定这实际上是如何解决复制问题的。如果我更改或添加下一个价格,仍然无法保证它会在正在读取的数据库中更新
  • 您可能对“最终”有一些性能要求。在此之前插入价格变化。
【解决方案3】:

正如 Mike Purcell 所说:“您可能还想考虑将他们选择的产品添加到他们的会话中,因此如果在他们结账之前价格确实发生了变化,他们就不会感到震惊。”

我认为这对您很重要,因为如果您正在同时更新其中一个 finsihes 但另一个没有同时进行购买,则用户可能会陷入错误的价格。

如果您在更新数据库时没有将整个站点关闭至少一两分钟以进行更新,那么我无论如何都想不出在每个事务发出请求之前不运行脚本来处理此问题支付网关。特别是如果您的用户已经在会话中。


在用户将请求转发到支付网关之前,您可以在每个数据库中查找商品价格,如果它们不相同,则重定向回产品页面?

如果更新间隔一秒钟,我可以看到这是一个切实可行的解决方案。

【讨论】:

  • 不确定用户是否会喜欢在结帐过程中被重定向回产品页面,并且可能会减少销售额下降,因为人们会跳转该网站并找到另一个销售相同产品的网站.
  • 我同意,我认为这会让用户感到困惑。
  • 是的,我没有真正考虑过。
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 2011-03-10
  • 2017-09-02
  • 2018-05-25
  • 2012-09-21
  • 2017-06-18
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多