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