群组通信使用的组和成员的概念,一般来说,成员是组的一个部分,一个组中包括很多成员。比较常见的术语,成员是一个节点,一组即是一个集群。我们这里就使用这些术语。
一个节点是一个进程,位于一些主机上。一个群集可以有一个或多个节点。在同一台主机可以有多个节点,所有节点可能会或可能不会是相同群集的一部分。节点当然也可以运行在不同的主机上。
JGroups 是一个可靠的组通信工具包。节点进程可以加入到一个组,发送消息给所有成员或单个成员,接收组中任何的成员发送的消息。系统跟踪组中的每一个成员,当新成员加入,已有成员退出或已有成员异常时会发送消息通知组成员时。 一个组使用名字来识别它自己。组没必要显式地创建,当一个进程加入一个不存在的组,该组将被自动创建。一组进程可以位于同一台主机上,在同一个局域网内,或通过广域网。成员可以是多个组的一部分。
如上为 JGroups 的架构图,它包括三个部分:
- 通道,用来构建可靠群组通信的应用
- 构建块,位于通道之上,是对通道提供了一个更高层面的抽象
- 协议栈,实现指定属性定义的协议,被通道使用
这里我们主要介绍如何通道 API,构建块,协议栈,通过这些介绍我们可以构建需要群组通信的分布式应用。
一个信道需要连接到一个协议栈,每当应用程序发送消息,通道传递给它的协议栈,并将它传递给最顶层的协议。该协议处理该消息将其传递给下层协议,因此消息被处理从一个协议到下一个协议直到最底层的协议,最底层的协议(传输层协议)将消息发送到网络上面。同样的情况发生在相反的方向上:传输层协议监听网络上的消息,当消息接收到同样会被从一个协议到下一个协议的处理,直到最上层到达通道。通道接着触发应用程序的 receive() 交付消息。
当应用程序连接到通道,协议栈将被启动。当应用程序断开通道,协议栈将被停止。当通道关闭,协议栈将被销毁,释放资源。接下来我们对通道,构建块,协议栈做一个简单介绍。
通道
一个节点程序要加入一个集群发送消息,这个节点程序必须首先创建一个通道,通过此通道使用一个集群名字可连接到集群(具有相同名称的所有通道组成一组)。通道是一个组的句柄,通道建立完成后,成员可发送和接收消息到/从所有其他组成员。组中成员通过断开通道离开群组。通道可以重新利用,断开连接后的成员可以通过重新连接连接到群组。然而,在某一特定时间点通道只允许被一个客户端连接。如果多个群组创建则需要创建多个通道。客户端成员的不在使用通道的信号将会关闭通道,当通道关闭之后则不能在被使用。
每个通道有一个唯一的地址,任何一个成员也有一个唯一的地址。通道总是知道群组中的所有成员的地址,我们可以通过通道检索出所有成员的地址的列表,这个列表叫做试图,一个成员可以从视图中选择一个成员并发送一对一的单波消息,一个成员也可以发送多波消息到所以群组成员(视图中)。无论成员加入或离开群组,或者错误被检查到,一个新的视图被创建,视图信息发送到剩余的其他成员,所有成员保持同步。
通道使用的属性通过 XML 文件提供,当然 JGroups 也允许通过简单字符串,URL,DOM树或编程接口。通道相关 API 我们将会在下面介绍。
构建块
通道是简单而原始的。通过对网络通信协议的简单封装,它很直观的提供了群组通信的功能,被广泛使用,很好理解。通常应用程序不需要使用所有 JGroups 很复杂的接口,只需要要使用 JGroups 接口中很少的一部分便能达到要求;JGroups 接口简单易懂,一般客户端应用只需使用 JGroups 的几个简单方法便可以创建的使用通道。
通道提供异步的消息发送/接收的功能,有点类似于UDP,消息发送到网络上后发送方法 send()将立即返回。概念上讲,对异步请求的响应是无序的,应用程序则要根据自己的业务逻辑处理处理返回消息的顺序。
JGroups 构建块是在通道之上,对通道通进一步封装,对应用提供了更复杂的 API。构建块即可以在内部使用的创建通道,也可以根据需要基于已存在的通道创建构建块。应用程序可以直接和构建块进行交互。使用构建块接口,程序员不在去写乏味重复的代码(请求-响应),总的来说构建块基于 JGroups 通道提供了更抽象的群组交互接口。同样我们将在下一章详细介绍构建块接口。
协议栈
协议栈包含一系列双向作用的协议,所有通过通道发送和接收的消息都需要在经过所有协议的处理,每一层协议都可以修改(添加消息头),重新排列,传递或删除消息,分离层协议可以将一个消息分成多个小的消息,给每个消息添加一个 ID 头,根据这些 ID 在接收端重新组装原来消息。
协议栈的组成,即它的协议,由通道的创建者决定,一个XML文件中定义所有被使用的协议(并为设定每个协议的参数)。然后,使用该配置来创建的协议栈。
如果只是简单的使用通道,那么对协议栈的详细理解是没有必要的,但是如果想理解 JGroups 更底层的原理,想对 JGroups 进行调优,那就需要研究详细的协议栈中的协议,可以通过设定协议栈中协议的参数来调优 JGroups。
Comments