Jgroups入门

原文 http://blog.csdn.net/geggegeda/archive/2008/07/04/

分布式通知技术-JGroups 入门 收藏

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

1 基本信息

摘要: 介绍什么是Multicast,什么是JGroups,以及JGroups详解

作者: 翁阳

2 什么是Multicast

   Multicast 是一种同时像多台机器发送数据的机制。Multicast使用224.0.0.0 到239.255.255.255 这段IP来传送数据,这段IP地址是保留的,发送到这上面的数据不会通过你的子网转发。在RFC-1060中定义了一部分预留的组播地址,使用时应注意不 要重复。

  一些比较特别的组播地址:

1) 224.0.0.0 这个是保留地址,不会被指定到任何的组播组 2) 224.0.0.1 这个地址在所有的主机上被指定为一个永久组播组,这个地址可以用来找到本地子网内所有的组播主机。使用ping 224.0.0.1可以查看这些地址。

   在一个组播中的所有主机使用一个相同的组播地址,它们被称为一个组(Group),组中的成员是动态的,他们可以随时加入或者离开组。每台主机可以同时 是多个组的成员,也可以不属于任何一个组。比较特别的是,并不是只有组中的成员才可以给组发送数据。组分为两种,一种是永久性的,一种是动态的。对于永久 性的组,他们拥有一个众所周知的管理IP地址,这个地址不是组中的成员,它是永久的。永久性的组可以拥有任何数量的成员,甚至没有成员。而动态组只有在拥 有成员的时候才存在。JGroups使用的就是动态组来实现组播数据的。

  3 什么是JGroups

  JGroups是一个可靠的组播通讯工具集(需要说明的是,这并不是说必须要使用IP Multicast,JGroups也可以使用TCP来实现)。JGroups可以用来创建一个组,这个组中的成员可以给其他成员发送消息。

  JGroups的主要功能如下:

1)创建和删除组,组成员可以分布在局域网或广域网中。 2)组成员加入和离开组 3)成员关系的自动侦测并通知成员的加入,离开和丢失(原文是crashed,大意就是说没有通知的离开吧) 4)侦测并删除丢失的成员 5)发送和接收成员到组的消息(点到多点) 6)发送和接收成员到成员的消息(点到点)

   JGroups使用灵活的协议栈,这也是JGroups最强大(the most powerful)的功能,它允许开发人员配置协议栈来适用于他们自己的应用需求和网络特征。这样做的好处在于,开发人员只需要关注他们使用到的协议。通 过组合和匹配各种协议来满足各种不同应用的需求。JGroups实现了一系列的协议(开发人员也可以编写他们自己的协议),例如:

传输协议:UDP(IP Multicast),TCP,JMS 分块协议:FRAG和FRAG2用来将大消息分块发送 可靠传输协议: UNICAST和NAKACK 失败侦测:FD(passive failure detection),VERIFY_SUSPECT。自动将丢失的成员排除到成员列表以外。 排序协议:Atomic (发送所有或者全部不发), FIFO, Causal, Total Order (序列或基于分块) 成员协议:GMS(Group membership)用来处理成员的加入和离开 加密:AES/ECB/PKCS5Padding/RSA...对传输的数据进行加密 其他还包括流量控制,统计等

  4 JGroups详解

  注意:以下内容基于JGroups 2.2,获取最新信息请访问 www.jgroups.org

  4.1 基本结构

  讲解之前我们先来看一个图,有一个直观的概念先

    其中有几个比较重要的概念需要解释一下:

  Channel

  一个Channel表示一个组播通讯的endpoint。客户端通过连接一个组播地址的Channel来加入一个组。

  Channel的FSM(状态机)大致如下:

unconnected:表示这个Channel创建了 connected:表示这个Channel已经连接到一个组,并可以发送和接收消息 unconnected:表示这个Channel从一个组断开,并可以加入其他组 closed:表示这个Channel已经关闭

  一个Channel同时只能有一个发送者发送消息(同步的),当然一个应用可以有多个Channel。可以使用Channel上send和receive(拉,可以通过linstener来实现推的模式)方法来发送和接收消息。

  Protocol Stack

  协议栈管理一组协议,并维持他们的上下关系,它负责创建所有的协议,并初始化和启动它们。它同时负责将从协议上接收到的消息发送到注册的对象上,比如Channel和GMP,并将来自这些对象的消息下发到协议栈上。 协议栈可以通过Configurator来设置,初始化,停止和删除协议。

  Event

  用来在协议层之间传递消息

  Protocol

  协议层被按顺序的放置到协议栈中。Event被从底层向上传递,比如UDP层接收到一个消息后,此消息将被当作一个Event向上层传递。每层协议都将按顺序处理Event,直到有一层发送一个响应或者丢弃这个消息。发送消息同样,只是从上而下调用协议层。

   每个协议都包括两个FIFO的队列,一个存放用来向下消息,一个用来存放向上的。无论消息上行还是下行都将先进入队列,并有相应的队列处理(up- handler和down-handler)来处理它们(调用这个协议上的up和down方法),协议的实现只需要实现相应的up和down方法,而无须 关心这些内容。

  有一点要特别指出的是,消息在协议层之间传递是按照FIFO顺序的,所有的协议实现必须保证这一点。

  4.2 协议详解

  JGroups中有非常多的协议实现(约50种),这里不可能全部拿来讲,我挑选一些比较常用的协议来讲,其他的可以通过查看Javadoc或者JGroups的源代码来了解。

  说明:以下协议中讲到到参数也只是常用参数,具体内容请查阅javadoc。

  4.2.1 数据传输及网络层协议

  这个协议是协议栈中相当重要的部分,它来完成数据的发送和接收。

  JMS

  使用Java Message Service (JMS)实现的传输协议,此协议依赖JMS服务器来分发消息,JMS服务器将发消息发送到特定的Topic下,所有订阅此Topic的将收到消息。关于JMS请访问: http://java.sun.com/products/jms/

  需要注意的是当使用JMS作为数据传输协议时应避免使用那些打开服务器连接的协议,比如FD_SOCKET。这JMS里FD比FD_SOCKET更合适。(关于FD和FD_SOCKET请看下面的介绍)

  参数表如下:

  TP

  这是一个传输协议的抽象类,TCP和UDP都是从这里继承而来,主要将将它的一些配置,这些配置都可以用再UDP和TCP协议上。

  参数表如下:

  TCP,TCP_NIO

   使用TCP实现的传输协议,创建一个ServerSocket来监听消息。对于每个连接(accept())都会创建一个线程来监听其消息,所有的外发 的消息对于每个目标地址都使用独立的线程来发送,这些线程是复用的。使用ConectionTable来实现以上机制。 NIO使用java.nio实现,关于NIO请访问: http://java.sun.com/j2se/1.4.2/docs/guide/nio/ 参数表如下:

对于TCP_NIO有如下附加参数:

  UDP,UDP_NIO

  使用UDP实现的组播协议,分别使用multicast socket和unicast socket来实现点到多点以及点到点。

  参数表如下:

  TUNNEL

  UDP的替代品,使用一个连接到Router的TCP连接来代替UDP,所有外发的消息都会先发送到Router,然后再有Router来分发所有连接到此组的TUNNEL上。

  此协议可以用来穿透防火墙,防火墙外的组成员使用Router连接到其的TCP连接向防火墙内发送消息。

  参数表如下:

2007/11/12 4:01

你可能感兴趣的:(socket,防火墙,jms,网络协议,网络应用)