Cajo,用Java完成分布式计算的最简单方法

摘自Jonas Boner在2006年5月1日发布在TheServerSide.com上的文章“ Distributed Computing Easy”中的介绍部分:

分布式计算在企业应用程序开发世界中变得越来越重要。 如今,开发人员不断需要解决以下问题:如何通过将应用程序扩展到单个节点之外来增强可伸缩性? 如何保证高可用性,消除单点故障并确保满足客户的SLA?

对于许多开发人员而言,解决该问题的最自然的方法是将体系结构分为在不同服务器之间分布的组件或服务组。 尽管这并不奇怪,但考虑到大多数开发人员所拥有的CORBA,EJB,COM和RMI的传统,如果您决定走这条路,那么您会遇到很多麻烦。 在大多数情况下,这样做是不值得的,它会给您带来更多无法解决的问题。

另一方面,分布式计算和Java自然地结合在一起。 作为自下而上设计的第一种语言,考虑了网络,Java使计算机之间的协作变得非常容易。 如果考虑一下,即使在浏览器中运行的最简单的applet也是分布式应用程序。 运行浏览器的客户端下载并执行其他系统提供的代码。 但是,如果没有Java的可移植性和安全性保证,即使是这个简单的applet也将无法实现:applet可以在任何平台上运行,并且不能破坏其主机。

cajo项目是一个小型图书馆,可实现强大的动态多计算机协作。 它非常易于使用,但性能无与伦比。 它是一个独特的“嵌入式”分布式计算框架:这意味着它对您的应用程序没有任何结构上的要求,也没有对源代码进行更改。 它允许多个远程JVM作为一个无缝地协同工作。

项目所有者约翰·凯瑟琳诺声称“山上之王! ;-)”并挑战所有愿意证明Java中存在与cajo同样灵活和一样快的分布式计算框架的人 。

说实话,我个人对约翰的话深信不疑。 我坚信如果您让我逐步介绍此客户端-服务器示例,您也将如此。 您会惊讶cajo框架多么简单和灵活:

Server.java

import gnu.cajo.Cajo; // The cajo implementation of the Grailpublic class Server {public static class Test { // remotely callable classes must be public// though not necessarily declared in the same classprivate final String greeting;// no silly requirement to have no-arg constructorspublic Test(String greeting) { this.greeting = greeting; }// all public methods, instance or static, will be remotely callablepublic String foo(Object bar, int count) {System.out.println("foo called w/ " + bar + ' ' + count + " count");return greeting;}public Boolean bar(int count) {System.out.println("bar called w/ " + count + " count");return Boolean.TRUE;}public boolean baz() {System.out.println("baz called");return true;}public String other() { // functionality not needed by the test clientreturn "This is extra stuff";}} // arguments and return objects can be custom or common to server and clientpublic static void main(String args[]) throws Exception { // unit testCajo cajo = new Cajo(0);System.out.println("Server running");cajo.export(new Test("Thanks"));}
}

通过以下方式进行编译:

javac -cp cajo.jar;. Server.java

通过以下方式执行:

java -cp cajo.jar;. Server

如您所见,只有2个命令:

Cajo cajo = new Cajo(0);
cajo.export(new Test("Thanks"));

我们可以将任何POJO(普通的Java旧对象)公开为分布式服务!

现在是Client.java

import gnu.cajo.Cajo;import java.rmi.RemoteException; // caused by network related errorsinterface SuperSet {  // client method sets need not be publicvoid baz() throws RemoteException;
} // declaring RemoteException is optional, but a nice reminderinterface ClientSet extends SuperSet {boolean bar(Integer quantum) throws RemoteException;Object foo(String barbaz, int foobar) throws RemoteException;
} // the order of the client method set does not matterpublic class Client {public static void main(String args[]) throws Exception { // unit testCajo cajo = new Cajo(0);if (args.length > 0) { // either approach must work...int port = args.length > 1 ? Integer.parseInt(args[1]) : 1198;cajo.register(args[0], port);// find server by registry address & port, or...} else Thread.currentThread().sleep(100); // allow some discovery timeObject refs[] = cajo.lookup(ClientSet.class);if (refs.length > 0) { // compatible server objects foundSystem.out.println("Found " + refs.length);ClientSet cs = (ClientSet)cajo.proxy(refs[0], ClientSet.class);cs.baz();System.out.println(cs.bar(new Integer(77)));System.out.println(cs.foo(null, 99));} else System.out.println("No server objects found");System.exit(0); // nothing else left to do, so we can shut down}
}

通过以下方式进行编译:

javac -cp cajo.jar;. Client.java

通过以下方式执行:

java -cp cajo.jar;. Client

客户端可以通过提供服务器地址和端口(如果有)或使用多播来查找服务器对象。 为了找到合适的服务器对象,使用“ 动态客户端子类型 ”。 对于所有不知道“ 动态客户端子类型化 ”代表什么的人,John Catherino在其相关博客文章中解释道:

“服务对象通常会实现大型的,丰富的接口。 有时,服务对象实现多个接口,将其功能分组为不同的逻辑问题。 通常,客户端只需要使用接口的一小部分即可。 或一些逻辑分组接口中的某些方法来满足其自身的需求。

客户端从服务对象定义的接口定义其自己的接口的能力在Java中称为子类型化。 (与子类形成对比)但是,与常规Java子类型不同; 动态客户端子类型化意味着创建一个完全不同的界面。 使此子类型成为动态的原因在于,它可以与原始的未经修改的服务对象一起使用。

对于客户端的复杂性管理,这可能是一种非常有效的技术。”

真的不是很酷吗??? 我们只需要定义客户端“需要”使用的接口并找到符合客户端规范的适当服务器对象。 从我们的示例中派生出以下命令即可完成此任务:

Object refs[] = cajo.lookup(ClientSet.class);

最后但并非最不重要的一点是,我们可以通过发出以下命令来创建服务器对象的客户端“代理”,并像普通的本地对象引用一样远程调用其方法:

ClientSet cs = (ClientSet)cajo.proxy(refs[0], ClientSet.class);

而已。 这些允许在分布式JVM之间实现完全的互操作性。 没有比这更容易的了。

就性能而言,我对提供的示例进行了一些初步测试,并在以下系统上获得了12000 TPS的平均分数:

Sony Vaio具有以下特征:

  • 系统:openSUSE 11.1(x86_64)
  • 处理器(CPU):Intel(R)Core(TM)2 Duo CPU T6670 @ 2.20GHz
  • 处理器速度:1,200.00 MHz
  • 总内存(RAM):2.8 GB
  • Java:OpenJDK 1.6.0_0 64位

为了方便起见,我提供了用于执行压力测试的代码段:

int repeats = 1000000;
long start = System.currentTimeMillis();
for(int i = 0; i < repeats;i ++)cs.baz();
System.out.println("TPS : " + repeats/((System.currentTimeMillis() - start)/1000d));

编码愉快! 并且不要忘记分享!

贾斯汀

相关文章 :
  • Java最佳实践–高性能序列化
  • Java最佳实践– Vector vs ArrayList vs HashSet
  • Java最佳实践–字符串性能和精确字符串匹配
  • Java最佳实践–队列之战和链接的ConcurrentHashMap
  • Java最佳实践– Char到Byte和Byte到Char的转换
  • 如何在不到1ms的延迟内完成100K TPS
  • 提升您的休眠引擎

翻译自: https://www.javacodegeeks.com/2011/01/cajo-easiest-way-to-accomplish.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中Integer.parseInt()用法

1.先看看该方法的实现 public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}2.事实上他可以有两个参数&#xff0c; public static int parseInt(String s,int radix)意味着将字符串s按照radix进制转换成整数。太抽象了&#xff0c;…

关于maven相互依赖的工程部署问题

环境&#xff1a;win7 64位&#xff0c;myeclipse10.6&#xff0c;eclipse4.5&#xff0c;都配置了svn插件 问题描述&#xff1a;1、工程模块化之后都是通过pom配置model来关联的&#xff0c;svn提交之后&#xff0c;通过myeclipse的svn‘检出为项目’&#xff0c;依赖的子工程…

什么是JAR包?

jar包就是别人已经写好的一些类&#xff0c;然后将这些类进行打包&#xff0c;你可以将这些jar包引入你的项目中&#xff0c;然后就可以直接使用这些jar包中的类和属性了&#xff0c;这些jar包一般都会放在lib目录下的 转载于:https://www.cnblogs.com/wulianshang/p/5513474.h…

....

输入流和输出流相对于内存设备而言. 将外设中的数据读取到内存中:输入将内存的数写入到外设中&#xff1a;输出。 字符流的由来&#xff1a;其实就是&#xff1a;字节流读取文字字节数据后&#xff0c;不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。…

DataNucleus 3.0与Hibernate 3.5

如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规范&#xf…

手工内存管理规则的总结

1.如果需要保持一个对象不被销毁,可以使用retain.在使用完对象后,需要使用release销毁 2.给对象发送release消息并不会销毁对象,只有当这个对象的引用计数减为0时,对象才会被销毁.然后系统会发送dealloc消息给这个对象用于释放它的内存. 对使用了retain或者copy,mutableCopy,al…

Java 字符,整型,字符串三者转换

1.整型 —> 字符型 先把整型转化为字符串&#xff0c;再把字符串转化为字符 //整型 ---> 字符型 toString(int n).charAt(int index) System.out.println(Integer.toString(20).charAt(0));2.整型 —> 字符串 //整型 ---> 字符串 Inte…

AngularJS 的常用特性(二)

3、列表、表格以及其他迭代型元素 ng-repeat可能是最有用的 Angular 指令了&#xff0c;它可以根据集合中的项目一次创建一组元素的多份拷贝。 比如一个学生名册系统需要从服务器上获取学生信息&#xff0c;目前先把模型之间定义在 JavaScript 代码里面&#xff1a; 1 var stud…

Ruby,Python和Java中的Web服务

今天&#xff0c;我不得不准备一些示例来说明Web服务是可互操作的。 因此&#xff0c;我已经使用Metro使用Java创建了一个简单的Web服务&#xff0c;并在Tomcat上启动了它。 然后尝试使用Python和Ruby消耗它们。 这是全部完成的过程… Java中的Web服务 我从Java中的简单Web服…

bzoj4199: [Noi2015]品酒大会

题面见http://uoj.ac/problem/131 一道后缀数组题 先求出height&#xff0c;然后从大到小枚举每个height。 然后对于每个height值&#xff0c;两端的集合中任意一对后缀的LCP都是这个height。 我们统计答案之后合并两端的集合&#xff0c;用并查集维护即可。 1 #include<cst…

css中position初解

positon:static|absolute|relative|fiexd 1、static为默认值&#xff0c;没有定位&#xff0c;元素出现在正常的文档流中&#xff0c;忽略left,right,top,bottom,i-index值。 2、absolute为绝对定位&#xff0c;通过left,top等值对元素进行定位&#xff0c;定位时如果父元素的p…

零XML的Spring配置

Tomasz Nurkiewicz是我们的JCG合作伙伴之一&#xff0c;也是Spring框架的坚定支持者&#xff0c;在他的最新文章中描述了如何在不使用XML的情况下配置Spring应用程序。 注解方法在顶部。 查看他的教程&#xff1a; 没有XML的Spring框架...根本&#xff01; 翻译自: https://ww…

用动画切换按钮的状态

用动画切换按钮的状态 效果 源码 https://github.com/YouXianMing/UI-Component-Collection // // BaseControl.h // BaseButton // // Created by YouXianMing on 15/8/27. // Copyright (c) 2015年 YouXianMing. All rights reserved. //#import <UIKit/UIKit.h> c…

iOS开发之学前了解

学iOS开发能做什么&#xff1f; iOS开发需要学习哪些内容&#xff1f; 先学习什么&#xff1f; 不管你是学习android开发还是iOS开发 都建议先学习UI&#xff0c;原因如下&#xff1a; UI是app的根基&#xff1a;一个app应该是先有UI界面&#xff0c;然后在UI的基础上增加实用功…

力扣gupiao

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

Java相当好的隐私(PGP)

公钥加密 这篇文章讨论了PGP或“很好的隐私”。 PGP是常规加密和公用密钥加密的混合实现。 在详细介绍PGP之前&#xff0c;让我们先谈谈公钥加密。 与其他任何加密技术一样&#xff0c;公钥加密解决了通过不安全介质传输安全数据的问题。 即互联网。 结果&#xff0c;该方案的…

HDU 5691 Sitting in Line 状压dp

Sitting in Line题目连接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5691 Description 度度熊是他同时代中最伟大的数学家&#xff0c;一切数字都要听命于他。现在&#xff0c;又到了度度熊和他的数字仆人们玩排排坐游戏的时候了。游戏的规则十分简单&#xff0c…

hello oc

printf("Hello C\n"); //OC可以采用C语言的输出方式 printf("The number is %d\n",100);//%d 输出数字 printf("Hello %s\n","XiaoMing");//%s 输出字符 NSLog("Hello Objective-C"); //采用oc的输出&#xff0c;前面带了一…

Spring3 RESTful Web服务

Spring 3提供了对RESTful Web服务的支持。 在本教程中&#xff0c;我们将向您展示如何在Spring中实现RESTful Web服务 &#xff0c;或者如何将现有的Spring服务公开为RESTful Web服务 。 为了使事情变得更有趣&#xff0c;我们将从上一篇关于Spring GWT Hibernate JPA Infinisp…

zoj 3765 块状链表 OR splay

各种操作o(╯□╰)o...不过都挺简单&#xff0c;不需要lazy标记。 方法1&#xff1a;块状链表 块状链表太强大了&#xff0c;区间操作实现起来简单暴力&#xff0c;效率比splay稍微慢一点&#xff0c;内存开销小很多。 1 #include <iostream>2 #include <cstring>3…