JGroups 初探
最近研究 JAVA 集群技术,看到 jgroups 这个框架,网上有些例子,非常简单。
可以参考其官方网址:http://www.jgroups.org/manual/index.html
按捺不住,自己还是动手写了一个试试。代码如下:
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.jgroups.stack.GossipRouter; import java.io.BufferedReader;
import java.io.InputStreamReader; /**
* JGroups 测试
*
* @author hjj2017
* @since 2016/1/14
*
*/
public class HelloJGroups extends ReceiverAdapter { // <-- 注意这里, HelloJGroups 即是消息的发送者又是消息的接收者
/** 用户名称 */
private String _userName = null;
/** JChannel */
private JChannel _channel = null; /**
* 开始测试
*
* @throws Exception
*
*/
private void start() throws Exception {
// 在这里生成用户名, User.00
this._userName = "User." + (int)(Math.random() * 100); // 创建 JChannel
this._channel = new JChannel();
this._channel.setReceiver(this);
this._channel.connect("ChatCluster"); // 事件循环
this.eventLoop(); // 事件循环结束之后,
// 关闭 JChannel
this._channel.close();
} /**
* 事件循环, 从终端读取文字
*
*/
private void eventLoop() {
// 创建读入流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) {
try {
// 输出提示符
System.out.print("~> ");
System.out.flush(); // 从终端读取文字
String ln = br.readLine(); if (ln.equalsIgnoreCase("quit") ||
ln.equalsIgnoreCase("exit")) {
// 遇到 quit / exit 时,
// 退出当前循环
break;
} // 创建并发送消息,
// 消息内容是 "${userName} : ${ln}"
Message msg = new Message(null, null, this._userName + " : " + ln);
this._channel.send(msg);
} catch (Exception ex) {
// 输出错误日志
ex.printStackTrace();
}
}
} @Override
public void viewAccepted(View v) {
System.out.println("viewAccepted : " + v);
} @Override
public void receive(Message msg) {
System.out.println(msg.getObject());
} /**
* 应用程序主函数
*
* @param args
* @throws Exception
*
*/
public static void main(String[] args) throws Exception {
new HelloJGroups().start();
}
}
这事一个简单的聊天程序,可以启动两次来观察结果。
-------------------------------------------------------------------
GMS: address=WINX-HOME-, cluster=ChatCluster, physical address=192.168.1.2:
-------------------------------------------------------------------
viewAccepted : [WINX-HOME-|] [WINX-HOME-]
~> -------------------------------------------------------------------
GMS: address=WINX-HOME-, cluster=ChatCluster, physical address=192.168.1.2:
-------------------------------------------------------------------
viewAccepted : [WINX-HOME-|] [WINX-HOME-, WINX-HOME-]
~>
可以看到,第二个启动的“WINX-HOME-1927”发现了第一个启动的“WINX-HOME-50829”。
注意我是在本地测试的,这个程序启动时会临时绑定一个端口。
启动两次,绑定两个不同的端口,会话过程是在同一台机器上的两个不同端口之间进行的。
程序启动之后,这两个程序会互相发现对方,这是这个框架一个比较方便的地方。
如果是在同一局域网里的两台不同的机器上会是什么结果呢?
我在家里的两台 PC 机上测试过,两台 PC 的 IP 地址不相同(192.168.1.2 和 192.168.1.6),
启动后仍然可以发现对方!
当然,这里面有个前提,两台机器连接着同一台路由器。
在真实的服务器环境中,所有的服务器都连接同一台路由器是不可能的!
为此,我们可以启动 GossipRouter,令所有的 JGroups 程序都连接到这个 GossipRouter 上。
我们大概需要做以下 3 步:
1. 启动 GossipRouter,绑定了 12001 端口:
java -Djava.net.preferIPv4Stack=true -cp .:commons-logging-1.1.3.jar:log4j-1.2.17.jar:jgroups-2.9.0.GA.jar org.jgroups.stack.GossipRouter -port 12001
2. 创建 myConf.xml 文件,文件内容大致如下:
<?xml version="1.0" encoding="utf-8" ?>
<config xmlns="urn:org:jgroups"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd"> <TCP />
<!--// 我试验过 TCPPING,但是失败了 //-->
<TCPGOSSIP
timeout="3000"
initial_hosts="xxx.xxx.xxx.xxx[12001]" <-- 注意这里的 xxx.xxx.xxx.xxx 需要换成真实 IP
num_initial_members="3"
/>
<VERIFY_SUSPECT timeout="1500" />
<pbcast.NAKACK
use_mcast_xmit="false"
retransmit_timeout="300,600,1200,2400,4800"
discard_delivered_msgs="true"
/>
<pbcast.STABLE
stability_delay="1000"
desired_avg_gossip="50000"
max_bytes="400000"
/>
<pbcast.GMS
print_local_addr="true"
join_timeout="5000"
view_bundling="true"
/> </config>
3. 修改 JChannel 创建代码,这是最后一步
// 只能使用文件绝对路径,
// 使用相对路径, JChannel 会产生歧义
final String xmlAbsPath = ClassLoader.getSystemResource(".").getPath() + "myConf.xml";
this._channel = new JChannel(xmlAbsPath);
关于 JGroups,目前我没有进行“大消息包”和“大集群量”的测试,还无法确定其性能表现。
如果性能方面表现良好,JGroups 放在游戏项目中,实现跨服聊天、跨服 PK 及分布式缓存,还是相当容易的。
JGroups 初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- 使用FPGA开发板驱动VGA显示器
1. 本次使用的是cyclone4开发板,先看下原理图,因为右边的RGB应该是模拟信号量,但是本次例程只接了3根线,那就是说颜色只有8种. 2. 代码,输出信号有R,G,B三色,就是上图右边的,行同步 ...
- 三种block
block的实现原理是C语言的函数指针. 函数指针即函数在内存中的地址,通过这个地址可以达到调用函数的目的. Block是NSObject的子类,拥有NSObject的所有属性,所以block对象也有 ...
- 用起来超爽的Maven——入门篇
你还在为怎样寻找.导入SSH相关依赖包纠结吗? 你还在为没有安装IDE开发工具不能编译.部署.运行项目而纠结吗? 你还在为公司项目目录结构怎样规范而纠结吗? 亲爱的纠结哥,只要你使用了Maven,一切 ...
- DO NOT BELIEVE HIS LIES 游戏随笔
这游戏是我大学的一个基友推荐的,好吧,感觉被他坑了··· 解谜游戏~慢慢来玩玩··· 恩,就是下面红色圈圈画起来的这个家伙. #1 第一关 好吧,界面上也没啥可聊的,上面写了一行字,THE FIRST ...
- webpack实践总结
一.Loader写法及执行顺序 从webpack2起,loader的格式如下: module: { rules: [ {test: /\.css$/, use: ['style-loader','cs ...
- 自动化测试元素查找利器firepath介绍
自动化测试查找元素和确定元素xpath路径是否正确在业界有个很好的工具就是firefox 浏览器的 firepath 问题: firefox 最新版本已经不支持firebug和firepath这两个插 ...
- day-9 sklearn库和python自带库实现最近邻KNN算法
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...
- 可以随着SeekBar滑块滑动显示的Demo
//关于Seek的自定义样式,之前也有总结过,但是,一直做不出随着滑块移动的效果,查询了很多资料终于解决了这个问题,现在把代码写出来有bug的地方 希望大家批评指正. Step 1 :自定义一个Vie ...
- DM8168通过GPMC接口与FPGA高速数据通信实现
硬件:TI达芬奇TMS320DM8168(以下简称DSP).EP4CE6E22C8N(以下简称FPGA) 软件:linux-2.6.37 转载请注明出处- http://www.cnblogs.com ...
- HDU 2131 Probability
http://acm.hdu.edu.cn/showproblem.php?pid=2131 Problem Description Mickey is interested in probabili ...