FourInOne(中文名字“四不像”)是一个四合一分布式计算框架,在写这个框架以前,我对分布式计算进行了长时间的思考,也看了老外写的其余开源框架,当咱们把复杂的hadoop看成一门学科学习时,彷佛忘记了咱们想解决问题的初衷:咱们仅仅是想写个程序把几台甚至更多的机器一块儿用起来计算,把更多的cpu和内存利用上,来解决咱们数量大和计算复杂的问题,固然这个过程当中要考虑到分布式的协同和故障处理。若是仅仅是为了实现这个简单的初衷,为何一切会那么复杂,我觉的本身能够写一个更简单的东西,它不须要过分设计,只须要看上去更酷一点,更小巧一点,功能更强一点。因而我将本身对分布式的理解融入到这个框架中,考虑到底层实现技术的类似性,我将Hadoop,Zookeeper,MQ,分布式缓存四大主要的分布式计算功能合为一个框架内,对复杂的分布式计算应用进行了大量简化和概括。html
首先,对分布式协同方面,它实现了Zookeeper全部的功能,而且作了不少改进,包括简化Zookeeper的树型结构,用domain/node两层结构取代,简化Watch回调多线程等待编程模型,用更直观的容易保证业务逻辑完整性的内容变化事件以及状态轮循取代,Zookeeper只能存储信息不大于1M的内容,FourInOne超过1M的内容会之内存隐射文件存储,加强了它的存储功能,简化了Zookeeper的ACL权限功能,用更为程序员熟悉rw风格取代,简化了Zookeeper的临时节点和序列节点等类型,取代为在建立节点时是否指定保持心跳,心跳断掉时节点会自动删除。FourInOne是高可用的,没有单点问题,能够有任意多个复本,它的复制不是定时而是基于内容变动复制,有更高的性能,FourInOne实现了领导者选举算法(但不是Paxos),在领导者服务器宕机状况下,会自动不延时的将请求切换到备份服务器上,选举出新的领导者进行服务,这个过程当中,心跳节点仍然能保持健壮的稳定性,迅速跟新的领导者保持心跳链接。基于FourInOne能够轻松实现分布式配置信息,集群管理,故障节点检测,分布式锁,以及淘宝configserver等等协同功能。node
其次, 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的框架限制住思惟,而且链式的每一个环节也方便进行监控过程。web
FourInOne也能够当成简单的mq来使用,将domain视为mq队列,每一个node为一个队列消息,监控domain的变化事件来获取队列消息。也能够将domain视为订阅主题,将每一个订阅者注册到domain的node上,发布者将消息逐一更新每一个node,订阅者监控每一个属于本身的node的变化事件获取订阅消息,收到后删除内容等待下一个消息。可是FourInOne不实现JMS的规范,不提供JMS的消息确认和消息过滤等特殊功能,不过开发者能够基于FourInOne本身去扩充这些功能,包括mq集群,利用一个独立的domain/node创建队列或者主题的key隐射,再仿照上面分布式缓存的智能根据key定位服务器的作法实现集群管理。算法
FourInOne总体代码仅仅为70k,跟Hadoop, Zookeeper, Memcache, ActiveMq等开源产品代码上没有任何类似性,不须要任何依赖,引用一个jar包就能够嵌入式使用,良好支持window环境,能够在一台机器上模拟分布式环境,更方便开发。数据库
开发包里自带了一系列傻瓜上手demo,包括分布式计算、统一配置管理、集群管理、分布式锁、分布式缓存、MQ等方面帮助掌握fourinone的所有功能编程
邮箱:fourinone@yeah.net
qq群:1313859设计模式