我工作的公司有一个网络系统,一些模块将在工作中使用,它们并不总是与互联网连接。 在构建中部署系统的Web模块的最佳解决方案是什么? 系统无法在数据库中读/写。
答案 0 :(得分:0)
您可以拥有一个在您的网络服务器上运行的本地数据库。每15分钟检查一次是否存在连接,并将更改从本地数据库传输到“真实”数据库。
答案 1 :(得分:0)
由于CAP theorem,这个问题没有完美的解决方案。如果有的话,分布式系统将更容易,但是:)
我看到它的方式,你有几个选择。所有选项都需要客户端数据的副本,以便客户端在断开连接时至少可以读取数据。
不允许写入不一致,只是读取不一致。
每当客户端离开网络时,客户端或服务器都会对数据进行写入所有权。允许写入数据的哪一方允许写入,另一方必须读取数据的可能过时的本地副本(或者如果这更好,则可能产生错误,或者至少告诉用户数据是陈旧的)。如果您有多个客户端同时运行,则会更加困难。
类似的方法是在您知道没有客户端工作时运行所有服务器端写操作(即在午夜运行所有工作)。它很简单,但适用于许多应用程序。
允许不一致,然后再处理。当您必须能够同时写入断开连接的网络的两侧时,这是唯一的方法。但是,有几种方法可以缓解不一致性问题,具体取决于您的设计:
如果你可以使所有转换成为可交换的(你可以改变转换的顺序并且结果是相同的),你可以存储在客户端和服务器上执行的转换,然后应用任何缓存的转换客户端重新连接到服务器时。这使得处理不一致非常简单。这就是ATM在与银行网络断开连接时所做的事情 - 它们的交换转换类似于,“从#12345号扣除50美元。”请注意,这仍然可能导致无效状态 - 用户可以通过访问与银行网络断开连接的多个ATM来扣除超过其帐户的费用。但是,当银行重新连接到网络时,银行会通过收取透支费来弥补这一点,因此他们通常不会因此而损失任何款项。
如果冲突很少,你可以告诉用户客户端,“嘿,你在离线时写了这个,但是服务器上的值发生了变化 - 我应该保留哪个副本?”这有一个问题,您可能需要多次询问,因为用户必须对正在更改的值执行原子CAS operation,并且可能多个客户端可能同时重新连接。如果你不小心(但这取决于你正在做的事情),这种方法也会受到ABA problem的影响。