系统在线或离线解决方案

时间:2013-04-24 20:47:48

标签: java primefaces distributed-transactions distributed-system

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

由于CAP theorem,这个问题没有完美的解决方案。如果有的话,分布式系统将更容易,但是:)

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

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

    • 每当客户端离开网络时,客户端或服务器都会对数据进行写入所有权。允许写入数据的哪一方允许写入,另一方必须读取数据的可能过时的本地副本(或者如果这更好,则可能产生错误,或者至少告诉用户数据是陈旧的)。如果您有多个客户端同时运行,则会更加困难。

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

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

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

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