【问题标题】:Solution for system online or offline系统在线或离线解决方案
【发布时间】:2013-04-18 14:05:19
【问题描述】:

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

【问题讨论】:

  • 类似于this
  • 如果您发现其中一个有用,请不要忘记接受答案!

标签: java primefaces distributed-transactions distributed-system


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我想过这个解决方案,但是由于web应用程序可以更改数据库中的数据,以及在构建中。并且系统有多种结构同时访问同一个数据库。这 15 分钟间隔内的交易可能存在不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2016-12-22
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多