由fourinone初步学习想到的

最近希望做分布式计算方面的支持,当然,省先要了解一下相关的内容。

以前就看到过taobao的fourinone框架的说明,感觉非常好,值得研究,于是就下载了fourinone-3.04.25的开源版本,地址https://code.google.com/p/fourinone/

不看不知道,一看,吓了一跳,难不成这个是拿出来之前处理过,专门让人看不懂的?

不解一、所有的类都在一个包名下,不同层次的代码都混在一起。很明显的,底层是分布式计算的基础部分,这个与具体实现的功能无关。

实现集群配置、集群文件系统、MQ、分布式缓冲之类的功能是基于核心功能进行扩展出来的新功能,最好的办法当然是分成多个工程;不能分成多个工程,好呆分成不同的包名,全部混在一个包之中,只有两种可能,一种是层次分解不清晰,另外一种是人为处理,不想让人看明白。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
ArrayAdapter.java
ArrayInt.java
AsyncExector.java
AuthPolicy.java
BeanContext.java
BeanService.java
Cache.java
CacheFacade.java
CacheLocal.java
CacheProxy.java
ClosetoOverException.java
ConfigContext.java
Contractor.java
ContractorParallel.java
ContractorService.java
CtorLocal.java
Delegate.java
DelegateConsole.java
DelegateHandle.java
DelegatePolicy.java
DelegateProcessor.java
DESBean.java
FileAdapter.java
FileBatch.java
FileException.java
FileResult.java
FttpAdapter.java
FttpContractor.java
FttpException.java
FttpLocal.java
FttpMigrantWorker.java
FttpWorker.java
FttpWorkerProxy.java
FttpWorkerService.java
HbDaemo.java
LastestEvent.java
LastestListener.java
LeaderException.java
LogUtil.java
MementoService.java
MigrantWorker.java
MulBean.java
ObjectBean.java
ObjectBeanList.java
ObjectBeanProxy.java
ObjectBytes.java
ObjectVersion.java
ObjValue.java
ParallelService.java
Park.java
ParkActive.java
ParkGroup.java
ParkInetServer.java
ParkLeader.java
ParkLocal.java
ParkManager.java
ParkMeta.java
ParkObjValue.java
ParkPatternBean.java
ParkPatternExector.java
ParkPermission.java
ParkProxy.java
ParkService.java
ParkStatg.java
PoolExector.java
RecallException.java
ResourceBean.java
Result.java
ServiceContext.java
ServiceException.java
StartResult.java
SuperContractor.java
WareHouse.java
Worker.java
WorkerLocal.java
WorkerParallel.java
WorkerParkProxy.java
WorkerProxy.java
WorkerService.java
WorkerServiceProxy.java
Workman.java
XmlCallback.java
XmlObjectCallback.java
XmlUtil.java
不解二、鲜见注释


从头到尾看不到多少注释,对于set、get实现,不写啥注释都可以理解的。但是连接口与重要的类也没有注释,对于阅读者来说就非常困难了。

不解三、命名给人带来的困扰

下面是一个接口

?
1
2
3
4
5
6
7
public interface Worker extends ParkActive
{
     public void setMigrantWorker(MigrantWorker mw) throws RemoteException;
     public WareHouse doTask(WareHouse inhouse) throws RemoteException;
     public void stopTask() throws RemoteException,InterruptedException;
     public boolean receiveMaterials(WareHouse inhouse) throws RemoteException;
}
下面是另外一个接口


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface FttpWorker extends ParkActive{
     public byte [] read(String f, long b, long t) throws RemoteException,FttpException;
     public byte [] readLocked(String f, long b, long t) throws RemoteException,FttpException;
     public int [] readInt(String f, long b, long t) throws RemoteException,FttpException;
     public int [] readIntLocked(String f, long b, long t) throws RemoteException,FttpException;
     public int write(String f, long b, long t, byte [] bs) throws RemoteException,FttpException;
     public int writeLocked(String f, long b, long t, byte [] bs) throws RemoteException,FttpException;
     public int writeInt(String f, long b, long t, int [] its) throws RemoteException,FttpException;
     public int writeIntLocked(String f, long b, long t, int [] its) throws RemoteException,FttpException;
     public FileResult getFileMeta(String f) throws RemoteException,FttpException;
     public FileResult[] getChildFileMeta(String f) throws RemoteException,FttpException;
     public String[] listRoots() throws RemoteException,FttpException;
     public File createFile(String f, boolean isFile) throws RemoteException,FttpException;
     public boolean deleteFile(String f) throws RemoteException,FttpException;
     public boolean copyFile(String f, long e, URI t) throws RemoteException,FttpException;
     public boolean renameFile(String f, String n) throws RemoteException,FttpException;
}
开始我根据命名理解,以为FttpWorker是继承  Worker的,显然我错了,这两个根本就没有关系,它们都继承自 ParkActive。偶的理解,如果两个是两个东东,要么就给 Worker前面加上一个另外的形容词可能更好。


好吧,接下来看看ParkActive长什么样:

?
1
2
3
4
package com.fourinone;
import java.rmi.Remote;
interface ParkActive extends ParkStatg,Remote{
}
再看ParkStatg  ,实际上是继承了序列化接口


?
1
2
3
4
5
package com.fourinone;
import java.io.Serializable;
interface ParkStatg extends Serializable{
     static final long serialVersionUID = 2983113349866492266L;
}

至次才明白,所谓的工人,就是带有远程访问接口和序列号接口的任意的类。它上面没有自己的任何接口方法。

但是这一圈转下来,嗯嗯,头有点晕。

不解四,散落的main

在程序中许多类中都有一个main方法在那里,虽然不一定能造成多坏、多大的影响,但是明显,这不是一个好的做法。

问题,哪位能给解释一下这些变量代表啥意思??

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ParkMeta
{
     private static String YSJ,YBB,YCJZ,YCIP,YCSJ,YQX,YSX,YGXZ,YGIP,YGSJ,SXXT;
     static {
         MulBean mb = ConfigContext.getMulBean();
         YSJ = mb.getString( "YSJ" );
         YBB = mb.getString( "YBB" );
         YCJZ = mb.getString( "YCJZ" );
         YCIP = mb.getString( "YCIP" );
         YCSJ = mb.getString( "YCSJ" );
         YQX = mb.getString( "YQX" );
         YSX = mb.getString( "YSX" );
         YGXZ = mb.getString( "YGXZ" );
         YGIP = mb.getString( "YGIP" );
         YGSJ = mb.getString( "YGSJ" );
         SXXT = mb.getString( "SXXT" );
     }
}



小结

到目前为止,还没有对fourinone有深入的了解,但是很明显的,令我有点失望。一开始,我觉得总共80多个类,去掉扩展的功能,核心的部分应该很少,大概也就30个左右差不多了,但是实际上看下来,还是感觉到比较困难。当然,这也与自己的水平与能力不足有相当的关系。

反过来说,开源,绝对不是把自己的代码放在别人能看得到的地方就叫开源了。如果别人看不懂,或者很难看懂,会直接影响到开源的目的与效果。
国人开源的意识及道路还很漫长,共勉!

  Fourinone(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架之前,我对分布式计算进行了长时间的思考,也看了老外写的其他开源框架,当我们把复杂的hadoop当作一门学科学习时,似乎忘记了我们想解决问题的初衷:我们仅仅是想写个程序把几台甚至更多的机器一起用起来计算,把更多的cpu和内存利用上,来解决我们数量大和计算复杂的问题,当然这个过程中要考虑到分布式的协同和故障处理。如果仅仅是为了实现这个简单的初衷,为什么一切会那么复杂,我觉的自己可以写一个更简单的东西,它不需要过度设计,只需要看上去更酷一点,更小巧一点,功能更强一点。于是我将自己对分布式的理解融入到这个框架中,考虑到底层实现技术的相似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和归纳。   首先,对分布式协同方面,它实现了Zookeeper所有的功能,并且做了很多改进,括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容变化事件以及状态轮循取代,Zookeeper只能存储信息不大于1M的内容,Fourinone超过1M的内容会以内存隐射文件存储,增强了它的存储功能,简化了Zookeeper的ACL权限功能,用更为程序员熟悉rw风格取代,简化了Zookeeper的临时节点和序列节点等类型,取代为在创建节点时是否指定保持心跳,心跳断掉时节点会自动删除。Fourinone是高可用的,没有单点问题,可以有任意多个复本,它的复制不是定时而是基于内容变更复制,有更高的性能,Fourinone实现了领导者选举算法(但不是Paxos),在领导者服务器宕机情况下,会自动不延时的将请求切换到备份服务器上,选举出新的领导者进行服务,这个过程中,心跳节点仍然能保持健壮的稳定性,迅速跟新的领导者保持心跳连接。基于Fourinone可以轻松实现分布式配置信息,集群管理,故障节点检测,分布式锁,以及淘宝configserver等等协同功能。   其次, Fourinone可以提供完整的分布式缓存功能。如果对一个中小型的互联网或者企业应用,仅仅利用domain/node进行k/v的存储即可,因为domain/node都是内存操作而且读写锁分离,同时拥有复制备份,完全满足缓存的高性能与可靠性。对于大型互联网应用,高峰访问量上百万的并发读写吞吐量,会超出单台服务器的承受力,Fourinone提供了fa?ade的解决方案去解决大集群的分布式缓存,利用硬件负载均衡路由到一组fa?ade服务器上,fa?ade可以自动为缓存内容生成key,并根据key准确找到散落在背后的缓存集群的具体哪台服务器,当缓存服务器的容量到达限制时,可以自由扩容,不需要成倍扩容,因为fa?ade的算法会登记服务器扩容时间版本,并将key智能的跟这个时间匹配,这样在扩容后还能准确找到之前分配到的服务器。另外,基于Fourinone可以轻松实现web应用的session功能,只需要将生成的key写入客户端cookie即可。   Fourinone对于分布式大数据量并行计算的解决方案不同于复杂的hadoop,它不像hadoop的中间计算结果依赖于hdfs,它使用不同于map/reduce的全新设计模式解决问题。Fourinone有“工头”,“农民工”,“手工仓库”的几个核心概念。“农民工”为一个计算节点,可以部署在多个机器,它由开发者自由实现,计算时,“农民工”到“手工仓库”获取输入资源,再将计算结果放回“手工仓库”返回给“工头”。“工头”负责承一个复杂项目的一部分,可以理解为一个分配任务和调度程序,它由开发者自己实现,开发者可以自由控制调度过程,比如按照“农民工”的数量将源数据切分成多少份,然后远程分配给“农民工”节点进行计算处理,它处理完的中间结果数据不限制保存在hdfs里,而可以自由控制保存在分布式缓存、数据库、分布式文件里。如果需要结果数据的合并,可以新建立一个“工头”的任务分配进行完成。多个“工头”之间进行责任链式处理。总的来说,是将大数据的复杂分布式计算,设计为一个链式的多“工头”环节去处理,每个环节括利用多台“农民工”机器进行并行计算,无论是拆分计算任务还是合并结果,都可以设计为一个单独的“工头”环节。这样做的好处是,开发者有更大能力去深入控制并行计算的过程,去保持使用并行计算实现业务逻辑的完整性,而且对各种不同类型的并行计算场景也能灵活处理,不会因为某些特殊场景被map/reduce的框架限制住思维,并且链式的每个环节也方便进行监控过程。   Fourinone也可以当成简单的mq来使用,将domain视为mq队列,每个node为一个队列消息,监控domain的变化事件来获取队列消息。也可以将domain视为订阅主题,将每个订阅者注册到domain的node上,发布者将消息逐一更新每个node,订阅者监控每个属于自己的node的变化事件获取订阅消息,收到后删除内容等待下一个消息。但是Fourinone不实现JMS的规范,不提供JMS的消息确认和消息过滤等特殊功能,不过开发者可以基于Fourinone自己去扩充这些功能,括mq集群,利用一个独立的domain/node建立队列或者主题的key隐射,再仿照上面分布式缓存的智能根据key定位服务器的做法实现集群管理。   Fourinone整体代码短小精悍,跟Hadoop, Zookeeper, Memcache, ActiveMq等开源产品代码上没有任何相似性,不需要任何依赖,引用一个jar就可以嵌入式使用,良好支持window环境,可以在一台机器上模拟分布式环境,更方便开发。   开发里自带了一系列傻瓜上手demo,括分布式计算、统一配置管理、集群管理、分布式锁、分布式缓存、MQ等方面, 每个demo均控制在少许行代码内,但是涵盖了Fourinone主要的功能,方便大家快速理解并掌握。   Fourinone 2.0新增功能:   Fourinone2.0提供了一个4合1分布式框架和简单易用的编程api,实现对多台计算机cpu,内存,硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。Fourinone框架提供了一系列并行计算模式(农民工/工头/职介绍/手工仓库)用于利用多机多核cpu的计算能力;提供完整的分布式缓存和小型缓存用于利用多机内存能力;提供像操作本地文件一样操作远程文件(访问,并行读写,拆分,排它,复制,解析,事务等)用于利用多机硬盘存储能力;由于多计算机物理上独立,Fourinone框架也提供完整的分布式协同和锁以及简化MQ功能,用于实现多机的协作和通讯。   一、提供了对分布式文件的便利操作, 将集群中所有机器的硬盘资源利用起来,通过统一的fttp文件路径访问,如:   windows:fttp://v020138.sqa.cm4/d:/data/a.log   linux:fttp://v020138.sqa.cm4/home/user/a.log   比如以这样的方式读取远程文件:   FttpAdapter fa = FttpAdapter("fttp://v020138.sqa.cm4/home/log/a.log");   fa.getFttpReader().readAll();   提供对集群文件的操作支持,括:   1、元数据访问,添加删除,按块拆分, 高性能并行读写,排他读写(按文件部分内容锁定),随机读写,集群复制等   2、对集群文件的解析支持(括按行,按分割符,按最后标识读取)   3、对整形数据的高性能读写支持(ArrayInt比ArrayList存的更多更快)   4、两阶段提交和事务补偿处理   5、自带一个集群文件浏览器,可以查看集群所有硬盘上的文件(不同于hadoop的namenode,没有单点问题和容量限制)   总的来说, 将集群看做一个操作系统,像操作本地文件一样操作远程文件。   但是fourinone并不提供一个分布式存储系统,比如文件数据的导入导出、拆分存储、负载均衡,备份容灾等存储功能,不过开发人员可以利用这些api去设计和实现这些功能,用来满足自己的特定需求。   二、自动化class和jar部署   class和jar只需放在工头机器上, 各工人机器会自动获取并执行,兼容操作系统,不需要进行安全密钥复杂配置   三、网络波动状况下的策略处理,设置抢救期,抢救期内网络稳定下来不判定结点死亡   本软件由www.gg265.net www.fmrpg.com站长提供
淘宝Fourinone2.0提供了一个4合1分布式框架和简单易用的编程API,实现对多台计算机CPU,内存,硬盘的统一利用,从而获取到强大计算能力去解决复杂问题。Fourinone框架提供了一系列并行计算模式(农民工/工头/职介绍/手工仓库)用于利用多机多核CPU的计算能力;提供完整的分布式缓存和小型缓存用于利用多机内存能力;提供像操作本地文件一样操作远程文件(访问,并行读写,拆分,排它,复制,解析,事务等)用于利用多机硬盘存储能力;由于多计算机物理上独立,Fourinone框架也提供完整的分布式协同和锁以及简化MQ功能,用于实现多机的协作和通讯。 fourinone-2.05.28\fourinone2.0 .................\............\config.xml .................\............\fourinone-2.05.28-src.jar .................\............\fourinone-2.05.28.jar .................\............\指南和demo .................\............\..........\MQ demo .................\............\..........\.......\MQ demo.txt .................\............\..........\.......\ParkServerDemo.java .................\............\..........\.......\Publisher.java .................\............\..........\.......\Receiver.java .................\............\..........\.......\Sender.java .................\............\..........\.......\Subscriber.java .................\............\..........\WordCount .................\............\..........\.........\inputdata.txt .................\............\..........\.........\ParkServerDemo.java .................\............\..........\.........\WordCount.txt .................\............\..........\.........\WordcountCT.java .................\............\..........\.........\WordcountWK.java .................\............\..........\分布式文件访问和操作demo .................\............\..........\........................\FttpBatchWriteReadDemo.java .................\............\..........\........................\FttpCopyDemo.java .................\............\..........\........................\FttpMulCopyDemo.java .................\............\..........\........................\FttpMulWriteReadDemo.java .................\............\..........\........................\FttpOperateDemo.java .................\............\..........\........................\FttpParseDemo.java .................\............\..........\........................\FttpRo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值