离线Web应用程序设计推荐

时间:2011-03-13 14:54:20

标签: ruby-on-rails offline rabbitmq

我想知道在这种情况下采用哪种最佳架构:

  1. 我有很多商店连接到使用Ruby on Rails开发的Web应用程序。
  2. 无法随时访问互联网
  3. 解决方案是开发一个离线系统,需要安装远程数据库的本地副本。
  4. 所有这一切都已经发展了。 现在我想做什么:

    • 始终使用数据库的本地副本。
    • 本地数据库的任何更改都应与远程数据库同步。
    • 所有本地副本应在其他本地副本中具有相同的数据。

    为了解决这个问题,我想到了最终使用类似软件的JMS Rabbit MQ。 这包括将任何sql请求推送到将在应用程序的远程实例上执行的JMS队列,该JMS队列将插入到远程DB中并将插入或SQL语句推送到将由所有本地实例读取的另一个队列中。这似乎很复杂,应该会减慢应用程序。

    我是否必须申请设计或建议来解决此类问题?

2 个答案:

答案 0 :(得分:2)

您可以这样做但基本上您正在开发自己的复制引擎。这些事情可能有点难以正确(如果m1和m3在副本r1上执行会发生什么,但m2不是?)我不想开发类似的东西,除非你确定你有资源要做它有效。

我会研究现有的现成复制解决方案。如果您已经在使用SQL DB,它可能会对它有一些支持。如果您使用MySQL

,请查看here以获取更多详细信息

或者,如果您愿意探索其他后端,我听说CouchDB非常支持复制。我也听说有人使用git库来做这类事情。

更新:在您发表评论后,我意识到您已经使用了MySql复制,并且正在寻找在脱机后重新同步数据库的解决方案。

即使在这种情况下,RabbitMQ根本不会帮助你,因为它需要不断的连接工作,所以你回到原点。最简单的解决方案是将所有更改(SQL命令)写入远程位置的文本文件中,然后当您获得连接时将该文件(scp,ftp,emaill或其他)复制到主服务器,在那里运行所有命令然后只需重新同步所有副本。

根据您的具体项目,您可能还需要确保从不同的远程位置运行命令时没有冲突,但是没有通用的技术解决方案。同样,根据项目,您可能希望取消其中一个事务,通知用户它发生了等等。

答案 1 :(得分:1)

我建议您查看CouchDB。它是一个非SQL数据库,可以完全按照您自动描述的内容执行操作。它特别适用于通常没有互联网或数据连接的手机应用程序。这个想法是你有一个CouchDB数据库的本地副本和一个或多个远程CouchDB数据库。然后,CouchDB服务器负责分布式系统的复制,并始终使用本地数据库。这种方法很好,因为您不必构建自己的分布式复制引擎。有关详细信息,我将查看其documentation的“分布式更新和复制”部分。