高性能高可用性Java EE分布式应用程序的数据通信和同步

时间:2017-08-11 06:06:53

标签: java architecture synchronization messaging distributed

在开始讨论我的问题之前,让我先解释一下我们需要使用的架构:

  • 我们将有一个中央应用程序实例。

    • 此应用程序实例与业务管理webapp一起部署 - 它用于更改“内部”数据(我稍后会谈到这一点)
    • 此应用程序实例实际上是服务器群集
  • 我们将有n(n> 0&& n< = 3000)本地应用程序实例 - 每个“位置”1个

    • 此实例用作其位置的数据处理器
    • 此实例不使用完整的中央数据集 - 仅限于数据处理所需的子集
    • 每个地点都可以(我们应该期待)长时间离线(比如说2周以上)
  • 每个位置都有几百个“客户”(假设最多300个) - 外部应用程序将提供处理数据

现在把所有东西放在一起: 如果位置在线,则客户端可以与本地实例或中心通信。但是,如果位置处于脱机状态,则中央不可用,客户端只能与本地实例通信。在这种情况下,本地实例应该像处理Central一样处理数据(因此根据中心定义的规则 - 我之前谈过的“内部”数据),缓存结果,当位置变为在线时,将其同步到中央(只是结果,没有重新计算中央)。 同时,本地实例应始终使其“内部”数据与中心保持同步(当它们处于联机状态时,如果它们处于脱机状态,我们假设数据为“新鲜”,只要离线时间不超过2周阈值)。或者,从另一方面看 - 当中心发生变化时,需要将其推送到所有可用的本地实例。

总而言之(最后问我的问题)我们需要一种方法将数据从Central实例同步到数千个Local实例,我们还需要一种方法将Local更改发送到Central。考虑到本地实例的数量,可能的高流量(每个本地最多可以有300个客户端,每个客户端每分钟可以生成多个请求,每个请求的计算可能需要花费很多时间,结果可能很大))和所有其他约束(例如,Central实例将是Weblogic服务器的集群,但每个Local将是单个WildFly,中央和本地的数据库也将不同 - 包括不同的模式,什么是最好的方法对于这种通信和同步问题?

1 个答案:

答案 0 :(得分:0)

看起来消息代理模式在这里最合适。 对于"当地人 - >中央"您可能会在本地存储的点对点消息中累积更改,这些消息发送到在线时段期间发送到中央服务器。您可以使用本地持久消息队列来实现此目的。 对于中央服务器发起的更改,您可以使用发布/订阅者模式并确保交付。 冲突的更改解决方案特定于您的业务逻辑。