【问题标题】:Java distributed tasksJava 分布式任务
【发布时间】:2015-11-26 14:18:35
【问题描述】:

我正在构建应该由 3 台服务器组成的系统,并且相同的 Java (Spring mvc) 服务将在所有 3 台服务器上运行。 Service 将能够执行 3 类任务,即 A、B 和 C。

我想要的是让服务器上的每个服务在与其他服务器通信时只执行一个类别。如果一台服务器死机,其余服务器应进行协商,并且只有其中一台服务器应采取类别。

例子:

  1. 服务器 1 - 服务执行 A

    服务器 2 - 服务 B

    服务器 3 - 服务执行 C

  2. 服务器 2 死亡

    服务器 1 和服务器 3 协商

    服务器 1 - 服务执行 A 和 B

    服务器 3 - 服务执行 C

如果服务器 2 恢复正常状态,它应该从服务器 1(A 或 B)获取类别

是否有任何模式、架构、技术、链接可以帮助我解决这个问题?

【问题讨论】:

  • 这个问题最好在serverfault.com 这样的网站上提出。 StackOverflow 是关于提出关于编程的问题,而不是一般的架构问题。
  • 您可以通过让所有服务器执行所有任务来大大简化它。然后使用 RabbitMQ 或 Amazon SQS 之类的消息队列来分发任务。

标签: java design-patterns architecture


【解决方案1】:

Zookeeper 专门用于在分布式环境中处理这些类型的场景。通过获取锁,将在 N 台服务器中选出一个 master。一旦 master 死亡,它会导致重新选举,新的 master 将服务客户端请求。

另一个容易出错的替代方法是自己实现共享的全局分布式锁并处理极端情况。获得锁的服务器将服务于客户端请求。

来自zookeeper 文档页面:

ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用

您可以在zookeeper Overview页面找到更多详细信息。

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 2013-03-16
    • 2020-11-25
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2015-01-06
    相关资源
    最近更新 更多