3

我工作的公司有一个网络系统,一些模块将在工作中使用,这些模块并不总是连接到互联网。在施工中部署系统的 Web 模块的最佳解决方案是什么?系统无法读取/写入数据库。

4

2 回答 2

0

由于CAP 定理,这个问题没有完美的解决方案。不过,如果有的话,分布式系统会容易得多:)

在我看来,你有几个选择。所有选项都需要数据客户端的副本,以便客户端至少可以在断开连接时读取数据。

  1. 不允许不一致的写入,只允许不一致的读取。

    • 每当客户端断开网络时,客户端或服务器都会获得数据的写所有权。拥有数据的任何一方都被允许写入,而另一方必须读取数据的潜在陈旧本地副本(或者如果这样做可能会产生错误,或者至少告诉用户数据是陈旧的)。如果您有多个客户端同时运行,这将更加困难。

    • 一种类似的方法是在您知道没有客户端在工作时运行所有服务器端写入操作(即在午夜运行您的所有作业)。这很简单,但它适用于许多应用程序。

  2. 允许不一致,然后再处理它们。当您必须能够同时写入断开连接的网络的两端时,这是唯一的方法。但是,根据您的设计,有几种方法可以缓解不一致问题:

    • 如果您可以使所有转换可交换(您可以更改转换的顺序并且结果将相同),您可以存储在客户端和服务器上执行的转换,然后在客户端重新连接时应用来自客户端的任何缓存到服务器。这使得处理不一致变得非常简单。这就是 ATM 与银行网络断开连接时所做的事情——它们的交换转换类似于“从账户 #12345 中扣除 50 美元”。请注意,这仍然可能导致无效状态 - 用户可以通过访问多个与银行网络断开连接的 ATM 来扣除比他们帐户中的更多的金额。但是,银行通过在 ATM 重新连接到网络时收取透支费用来弥补这一点,因此它们通常不会因此而损失任何资金。

    • 如果冲突很少,你可以告诉客户端的用户,“嘿,你是在离线时写的,但是服务器上的值发生了变化——我应该保留哪个副本?” 这存在您可能需要多次询问的问题,因为用户必须对正在更改的值执行原子CAS 操作,并且多个客户端可能同时重新连接。如果您不小心,这种方法也可能会遇到ABA 问题(但这取决于您在做什么)。

于 2013-05-21T07:01:01.547 回答
0

您可以拥有在您的网络服务器上运行的本地数据库。每 15 分钟检查一次是否存在连接,并将更改从本地数据库传输到“真实”数据库。

于 2013-04-24T20:53:52.450 回答