确保数据库一致性。

4
如果我有一个分布式数据库,它是“最终一致性”的,那么如果我有一个类似于销售产品的网站,我正在改变商品的价格会发生什么?
如果一个产品的价格是X,我将其更新为价格Y,某些版本的数据库仍可能显示价格X。如果顾客去结账,有没有策略来确保他们实际上得到的是最新的价格,以便他们不会被收取错误的价值?
在某个时候,我难道不需要对数据进行一些完整性检查,以确保正在使用最新的价值?

你是否在使用第二个副本数据库进行负载均衡? - Dan Kanze
@DanKanze,是的,副本将用于负载均衡。 - Jeff Storey
@DanKanze 另一个可能性是数据库用于本地化。例如,如果我从位置X登录,我会访问靠近我的一个数据库。 - Jeff Storey
这不是一致性定义中所描述的吗?我阅读了维基,发现你的问题是数据库系统技术的典型情况。我对数据库不是很了解,但我知道许多数据库在生产中都致力于此,这涉及到架构方面的东西。 - Reorx
@Reorx 最终一致性是一种模型,其中并不保证数据库的所有副本在给定时间都是最新的。因此,我想知道在使用最终一致性模型时如何解决这个问题。 - Jeff Storey
3个回答

4

我们过去有一个自定义脚本来跟踪复制滞后,但那是几年前的事了。从那时起,我们已经转用由Percona Toolkit提供的心跳监控。

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


@MikePurcell,您能详细说明一下“考虑将他们选择的产品添加到其会话中,以便如果价格发生变化...”的意思吗?我该如何验证价格是否实际发生了变化?我可以尝试验证数据是否过时(也许使用您上面提到的工具包之类的东西),然后如果数据过时,就向主服务器咨询正确的值?这是您所建议的吗? - Jeff Storey
关闭,我建议您尝试通过心跳监视器(以及其他可用的方法)显示尽可能最新的价格,但当用户选择购买产品时,请将该产品的价格添加到其当前会话中,使价格对用户始终保持一致。如果他们从购物车(会话)中删除该商品,则可以强制刷新页面,以显示最新的价格,以防他们再次选择该商品。 - Mike Purcell
有道理。但是假设我把一个产品放入购物车里,价格是$1。现在网站所有者意识到价格应该是$10。当我去结账时,应该通知我价格是$10而不是$1。您的解决方案能解决这个问题吗? - Jeff Storey
另一种选择是使用2个数据库 - 一个用于产品价格,这个例子中的。该数据库将保证一致性。由于这个数据库会有相对较少的写入操作,因此性能损失不应太大。然后,一个数据库可以拥有可以容忍最终一致性的数据,例如产品描述。只是一个想法。显然,我需要进行一些测试,以确定我的瓶颈在哪里等等。 - Jeff Storey
从1美元到10美元的价格变化是一个明显的问题,老实说,我会在用户使用过程中改变价格。我想这取决于对价格变化的容忍程度。调整1-2%的价格是否值得失去潜在客户? - Mike Purcell

1

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

更好的方法是为物品/价格组合创建一个唯一标识符,并在显示目录时记录它,这样就不会出现与所提供的内容不符的情况。(当然,要设置一些合理的超时时间以防止滥用。)


@ledorfier,我不确定这实际上如何解决复制问题。如果我更改或添加下一个价格,仍然不能保证它会从正在进行读取的数据库中更新。 - Jeff Storey
你可能对“最终”有一些性能要求。在此之前插入价格更改。 - dkretz

0

正如 Mike Purcell 所说: "您可能还想考虑将他们选择的产品添加到他们的会话中,这样如果在他们结帐前价格发生变化,他们就不会感到震惊。"

我认为这对你很重要,因为如果你正在同时更新两个东西,其中一个完成而另一个没有完成,用户在进行购买时可能会被困在错误的价格中。

如果您要更新数据库而不关闭整个站点至少一两分钟以进行更新,我无法想出任何方法来处理此问题,除非在每个交易发出请求到付款网关之前运行脚本。特别是如果您的用户已经在会话中。


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

如果更新相隔一秒钟,我认为这是一个切实可行的解决方案。


不确定用户在结账过程中被重定向回产品页面是否会喜欢,这可能会导致销售下降,因为人们可能会跳转到其他销售相同产品的网站。 - Mike Purcell
我同意,我认为这会让用户感到困惑。 - Jeff Storey
是的,没错,我确实没有考虑到那个。 - Dan Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接