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.pswp.cn/news/374651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374651.shtml
英文地址,請注明出處:http://en.pswp.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…