Welcome 微信登录

首页 / 软件开发 / JAVA / 构建服务器集群感知的Java应用程序

构建服务器集群感知的Java应用程序2013-09-18 IBM Mukul Gupta, Paresh Paladiya如今,许多企业应用程序都由一组合作的分布式进程和服务器交付。例如,可向几乎所有流行的 Java 企业服务器的 Web 请求提供服务器集群功能,这些服务器还可以提供有限的配置选项,如服务器权重和配置重新加载。

虽然大多 数 Java 企业服务器具有集群的内置支持,但对于自定义用例来说,在应用程序级并没有现成提供这种支持。作为软件开发 人员,我们应该如何管理涉及分布式任务协调或支持多租户应用程序的用例?(多租户应用程序 是要求实例在整体服务器 集群或组的子集上被隔离的应用程序。)对于这些类型的用例,我们必须找到一种方法,使得组协调功能在应用程序软件层 上可用,最好能在高级别的抽象层上提供。

在本文中,我们提供了将组成员和管理功能融合到分布式 Java 应用程 序中的指南。我们将从一个基于 Spring Integration 的模拟 Java 应用程序开始,利用基于两个开源项目(Apache ZooKeeper 和 LinkedIn 的 Project Norbert)的服务器集群抽象层来进行构建。

服务器集群概述

服务器集 群感知的应用程序通常至少需要以下功能:

具有状态维护和查询功能的组成员:需要实时组成员,以便在一组活动的服务器上分发处理。为了管理组成员,应用程 序必须能够建立一个进程/服务器组,并跟踪该组中所有服务器的状态。当某台服务器停机或上线时,它还必须能够通知活 动的服务器。该应用程序将只在集群中的活动服务器之间对服务请求执行路由和负载均衡,从而帮助确保实现高可用的服务 。

主要进程或领袖进程:这是一个在集群中的进程,负责维护整个服务器集群的同步状态的协调功能。选择领袖进程的机 制是被称为分布式共识 的一组更广泛的问题中的一个特例。(两阶段提交和三阶段提交是众所周知的分布式共识问题。)

任务协调和动态的领袖服务器选举:在应用程序级别,领袖服务器 负责任务协调,通过集群中的其他(跟随者)服务器 之间分发任务来做到这一点。拥有一台领袖服务器,可以消除服务器之间潜在的争用,否则争用将需要某种形式的互斥或锁 定,才可以使符合资格的任务运行(例如,服务器对来自公共数据存储的任务进行轮询)。正是动态领袖选举使得分布式处 理变得可靠;如果领袖服务器崩溃,可以选举新的领袖继续处理应用程序任务。

组通信:在一个集群感知的应用程序中的应用程序应该能够在整个服务器集群中促进结构化数据和命令的高效交换。

分布式锁和共享数据:如果有需要,分布式应用程序应该能够访问的特性包括分布式锁和共享数据结构,如队列和映射 。

示例:Spring Integration

我们的代表示例是一个企业应用程序集成 (EAI) 场景,我们将利用基于 Spring Integration 的模拟应用程序处理该场景。该应用程序具有以下特征和要求:

一个模拟源应用程序产生与集成相关的事件和消息作为其日常事务处理的一部分,并将它们存储在一个数据存储中。

集成事件和消息由一组分布式 Java 进程(一个服务器集群)进行处理,这些进程可以在同一台服务器上运行,也可以 分布在由一个高性能网络连接的多台计算机上。需要服务器集群来实现可扩展性和高可用性。

每个集成事件只由任一集群成员(即特定的 JVM)处理一次。输出消息通过 Intranet 或 Internet 被传递给合作伙伴 应用程序(如果适用)。

图 1 显示了集成事件和从模拟源应用程序出站的消息处理流。

图 1. 基于 Spring Integration 的示例应用程 序示意图