- 浏览: 483270 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
龘龘龘:
TrueBrian 写道有个问题,Sample 1中,为了控制 ...
What's New on Java 7 Phaser -
龘龘龘:
楼主总结的不错。
What's New on Java 7 Phaser -
TrueBrian:
有个问题,Sample 1中,为了控制线程的启动时机,博主实际 ...
What's New on Java 7 Phaser -
liguanqun811:
不知道楼主是否对zookeeper实现的分布式锁进行过性能测试 ...
Distributed Lock -
hobitton:
mysql的get lock有版本限制,否则get lock可 ...
Distributed Lock
1 Overview
JGroups是一个用于建立可靠的组播通信的工具包(这里指的组播并不一定是IP Multicast,JGroups同样支持使用TCP作为传输协议)。其中可靠性是指通过适当的配置可以保证:消息在传输的过程中不会丢失;所有的接收者以相同的顺序接受所有的消息;原子性:一个消息要么被所有的接收者接收,要么不被任何一个接收者都接收。目前在JBoss Application Server Clustering,OSCache Clustering,Jetty HTTP session replication, Tomcat HTTP session replication中都使用了JGroups。
Unreliable | Reliable | |
Unicast | UDP | TCP |
Multicast | IP Multicast | JGroups |
TCP和UDP是单播(Unicast)协议,也就是说:发送者和每一接收者之间是点对点传输。 如果一个发送者希望向多个接收者传输相同的数据,那么必须相应的复制多份数据。TCP是可靠的传输协议,但UDP不是可靠的,也就是说报文在传输的过程中可能丢失、重复或着乱序,报文的最大尺寸也有限制。IP Multicast可以将消息同时发送到多个接收者。由于IP Multicast是基于UDP的,因此IP Multicast是不可靠的。IP Multicast需要一个特殊的组播地址,它是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255,其中有一部分地址是为特殊的目的保留的。JGroups使用UDP (IP Multicast)、TCP、JMS作为传输协议。JGroups最强大的功能之一是提供了灵活的,可定制的协议栈,以满足不同的需求。例如,如果选择使用IP Multicast作为传输协议,那么为了防止报文丢失和重复,可以在协议栈中添加NAKACK协议;为了保证报文的顺序,可以在协议栈中添加TOTAL协议,以保证FIFO的顺序;为了在组内成员发生变化时得到通知和回调,可以添加Group Membership Service (GMS) 和 FLUSH协议;Failure Detector (FD)协议用于识别组内崩溃的成员;如果新加入的成员希望获得组内其它成员维护的状态,那么可以向协议栈中添加STATE_TRANSFER协议;如果希望对传输的数据进行加密,那么可以使用CRYPT协议等等。
JGruops的主要功能有:
- 组的创建和删除。组可以跨越LANs或者WANs。
- 加入组、主动或者被动(例如当机或者网络故障)离开组。
- 在组成员改变时,组中其它成员可以得到通知。
- 向组中的单个或者多个成员发送消息。
在JGroups中JChannel类提供了主要的API ,用于连接到集群(cluster)、发送和接收消息(Message)和注册listeners等。Message包含消息头(保存地址等信息)和一个字节数组(保存希望传输的数据)。org.jgroups.Address接口及其实现类封装了地址信息,它通常包含IP地址和端口号。连接到集群中的所有实例(instance)被称为一个视图(org.jgroups.View)。通过View.getMembers()可以得到所有实例的地址。实例只有在连接到集群后才能够发送和接收消息。以相同name调用JChannel.connect(String name)方法的所有实例会连接到同一个集群。当实例希望离开集群时,可以调用JChannel.disconnect()方法。当希望释放占有的资源时,可以调用JChannel.close()方法。JChannel.close()方法内部会调用JChannel.disconnect()方法。
通过调用JChannel.setReceiver()方法可以接收消息和得到View改变的通知。每当有实例加入或者离开集群的时候,viewAccepted(View view)方法会被调用。View.toString()方法会打印出View中所有实例的地址,以及View ID。需要注意的是,每次viewAccepted(View view)方法被调用时,view参数都不同,其View ID也会增长。View内的第一个实例被称为coordinator。Receiver接口上的getState(),setState()方法用于在实例间传递状态。新的实例通过setState()方法获得通过状态,而这个状态是通过调用集群中其它某个实例上的getState()获得的。
以下是JGruops manual中的一个简单的例子:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.List; import org.jgroups.JChannel; import org.jgroups.Message; import org.jgroups.ReceiverAdapter; import org.jgroups.View; import org.jgroups.util.Util; public class SimpleChat { // private JChannel channel; private List<String> state = new LinkedList<String>(); private String userName = System.getProperty("user.name", "WhiteSock"); public void start() throws Exception { // channel = new JChannel(); channel.setReceiver(new ReceiverAdapter() { public void receive(Message msg) { System.out.println(msg.getSrc() + ": " + msg.getObject()); synchronized(state) { state.add((String)msg.getObject()); } } public void viewAccepted(View view) { System.out.println("view accepted: " + view); } public byte[] getState() { synchronized(state) { try { return Util.objectToByteBuffer(state); } catch(Exception e) { e.printStackTrace(); return null; } } } @SuppressWarnings("unchecked") public void setState(byte[] new_state) { try { List<String> list=(List<String>)Util.objectFromByteBuffer(new_state); synchronized(state) { state.clear(); state.addAll(list); } System.out.println("received state (" + list.size() + " messages in chat history):"); for(String str: list) { System.out.println(str); } } catch(Exception e) { e.printStackTrace(); } } }); channel.connect("ChatCluster"); channel.getState(null, 10000); // sendMessage(); // channel.close(); } private void sendMessage() throws Exception { boolean succeed = false; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.print(">"); System.out.flush(); String line = br.readLine(); if(line != null && line.equals("exit")) { break; } else { Message msg = new Message(null, null, "[" + userName + "]" + line); channel.send(msg); } } succeed = true; } finally { if(br != null) { try { br.close(); } catch (Exception e) { if(succeed) { throw e; } } } } } public static void main(String args[]) throws Exception { new SimpleChat().start(); } }
在以上例子中,主线程会阻塞,直到从stdin中读取一行。如果这行是"exit",那么程序退出,否则向集群中发送一个消息。如果集群中某个实例强行退出,那么集群中的其它实例也会得到通知。Message构造函数的第一个参数如果是null,那么意味着消息将被发送到集群内所有的实例。
评论
发表评论
-
Understanding the Hash Array Mapped Trie
2012-03-30 10:36 0mark -
A Hierarchical CLH Queue Lock
2012-01-14 19:01 2146A Hierarchical CLH Queue Lock ( ... -
Inside AbstractQueuedSynchronizer (4)
2012-01-08 17:06 3517Inside AbstractQueuedSynchroniz ... -
Inside AbstractQueuedSynchronizer (3)
2012-01-07 23:37 4718Inside AbstractQueuedSynchroniz ... -
Inside AbstractQueuedSynchronizer (2)
2012-01-07 17:54 6362Inside AbstractQueuedSynchroniz ... -
Inside AbstractQueuedSynchronizer (1)
2012-01-06 11:04 7944Inside AbstractQueuedSynchroniz ... -
Code Optimization
2011-10-14 00:11 1605当前开发人员在进行编码的时候,可能很少关注纯粹代码级别的优化了 ... -
Distributed Lock
2011-08-02 22:02 92011 Overview 在分布式系统中,通常会 ... -
What's New on Java 7 Phaser
2011-07-29 10:15 82611 Overview Java 7的并 ... -
Sequantial Lock in Java
2011-06-07 17:00 22101 Overview Linux内核中常见的同步机 ... -
Feature or issue?
2011-04-26 22:23 121以下代码中,为何CglibTest.intercept ... -
Bloom Filter
2010-10-19 00:41 50711 Overview Bloom filt ... -
Inside java.lang.Enum
2010-08-04 15:40 64701 Introduction to enum J ... -
Open Addressing
2010-07-07 17:59 34541 Overview Open addressi ... -
JLine
2010-06-17 09:11 11003Overview JLine 是一个用来处理控 ... -
ID Generator
2010-06-14 14:45 1674关于ID Generator,想 ... -
inotify-java
2009-07-22 22:58 82891 Overview 最近公 ... -
Perf4J
2009-06-11 23:13 84851 Overview Perf4j是一个用于计算 ... -
Progress Estimator
2009-02-22 19:37 1530Jakarta Commons Cookbook这本书 ... -
jManage
2008-12-22 00:40 39551 Overview 由于项目需要, 笔者开发了一个 ...
相关推荐
jgroups.part1
JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 ...
1. 添加Jgroups和Ehcache的依赖到项目中。 2. 配置Ehcache的`ehcache.xml`,设置`distributed`为`true`启用分布式缓存,并指定Jgroups配置文件的位置。 3. 在代码中初始化Ehcache,确保使用的是集群配置。 测试集群...
如果需要更小的JAR包,可以下载源代码并执行“jar”目标,生成大约1MB大小的`jgroups-core.jar`。 - `log4j.jar`(可选):日志库,JGroups也可以使用JDK自带的日志框架。 - 多种XML配置文件,例如: - `mping.xml`...
jgroups-raft 项目是 JGroups 框架对 Raft 的实现。Maven:<groupId>org.jgroups <artifactId>jgroups-raft <version>0.2</version>Raft 是一个容易理解的共识算法。在容错和性能方面它相当于 Paxos(Google 的一致...
jgroups-2.2.7.jar jgroups-2.2.7.jar
1. **组通信**:JGroups支持多播和单播通信,允许节点加入和离开组,实现组内的消息广播和点对点通信。 2. **容错机制**:通过心跳检测和故障恢复策略,确保在节点失败时,群组能够快速识别并重新组织。 3. **消息...
JGroups(Java多播通讯框架)简介 JGroups是一个可靠的群组通讯Java工具包。它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展。 JGroups的可靠性体现在: 1,对所有接收者的消息的无丢失传输...
此文档主要针对JGroups 2.X版本的官方帮助文档进行详细解读,旨在帮助开发者深入理解并有效地利用JGroups。 一、JGroups简介 JGroups的核心目标是确保在分布式环境中数据的一致性。它提供了一套完整的工具,用于...
JGroups的主要功能如下: 1)创建和删除组,组成员可以分布在局域网或广域网中。 2)组成员加入和离开组 3)成员关系的自动侦测并通知成员的加入,离开和丢失(原文是crashed,大意就是说没有通知的离开吧) 4)...
Jgroups 中的 UNICAST3 协议详解 Jgroups 是一种基于 IP 多播的可靠的组播中间件,UNICAST3 协议是 Jgroups 中的一种单播协议,旨在保持单播和 UNICAST2 的正面特征,而修正负面特征。 UNICAST3 协议的主要特点是...
《JGroups:构建高效可靠的组通信系统》 JGroups是一个用Java编程语言编写的开源库,专注于实现基于IP组播的高效、可配置的组通信协议栈。它为分布式系统提供了一种健壮且灵活的方式来实现节点间的通信,是构建大...
// $Id: README,v 1.7 2006/08/09 13:08:02 belaban Exp $ JGroups - A Framework for Group Communication in Java ...consists of 3 parts: (1) a socket-like API for application development,
若需更小的JAR包,可下载源码包并执行“jar”目标,生成大约1MB大小的`jgroups-core.jar`。 - `log4j.jar`(可选):commons-logging也可以使用JDK自带的日志记录。 此外,目录还包含多种XML配置文件,例如`mping....
JGroups是一个开源的纯java编写的可靠的群组通讯工具。其是一个可靠的组播通讯工具集(需要说明的是,这并不是说必须要使用IP Multicast,JGroups也可以使用TCP来实现)。其工作模式基于IP多播,但可以在可靠性和群组...
1. **节点发现**:新加入的节点能够自动发现并加入到集群中。 2. **消息传递**:确保消息在集群中的可靠传输,支持顺序消息、无序消息、同步和异步消息。 3. **故障检测**:通过心跳机制监测节点状态,快速识别并...
1. 消息发送: 在JGROUPS中,消息发送是通过`Channel`接口完成的。用户可以通过调用`Channel.send()`方法发送一个消息到集群中的其他节点。此过程涉及到以下几个关键步骤: - **消息构造**:首先,你需要创建一个`...
jgroups.part3