讨论一下淘宝的Fourinone
程序员文章站
2022-05-06 13:00:12
...
fourinone号称了集成了hadoop,zk,memcache,mq于一身的四不像超级神器,致力于分布式应用。别的我不懂,今儿聊一下fourinone中的分布式缓存以及分布式文件系统,说到分布式,不得不用到网络通讯,不得不提及RPC,fourinone号称只有100多K,不依赖任何第三方jar,那通讯怎么玩啊!自己用socket或者NIO实现,要知道用NIO实现一个网络通讯框架是很考验技术功底,淘宝的boyan曾经有一篇ppt介绍过NIO的trap和trick.作者当然是绕开这些,使用JDK自带的RMI,RMI这项技术有点老了,我看过JDK的实现还是采用BIO,one request per one thread的方式,序列化采用JDK本身的序列化,性能我不好做评价,因为我没有用过。
好了回归主题,说一说分布式缓存,主流的分布式缓存我们知道用memcached、redis这两个都很出色,fourinone的分布式缓存类似memcached,只支持kv存储。那他是怎么是实现呢?说到kv存储,HashMap是不二之选,对4in1应该也是用的LinkedHashMap,LinkedHashMap,用额外的链表记录访问顺序,LinkedHashMap提供了一个接口removeEldestEntry,使在插入时有机会删除那些最近不活跃的entry,ok继续,分布式缓存,那网络通讯怎么玩的呢?当然是我们前面提到的RMI。至此了解了分布式缓存的实现,简单吧!我相信各位看官看了我的描述自己也能实现了一个自己把玩一下。
继续,说一下这样做的问题,分布式系统几乎是为了高并发而设计的,memcache,redis都是这样。HashMap在高并发下又会怎么样呢?我想你此时脑子里会出现一个场景,这是一个坑,HashMap不是线程安全的,在并发情况下扩容会导致死循环从而导致cpu100%。不了解的可以在coolshell上搜一下,或者问度,这是个致命的问题,我不知道作者是怎么解决的,同步加锁,我没有看到sync,用concurrenthashmap貌似也没用吧。因为concurrenthashmap虽然是线程安全的,但是却没有LRU的功能,如果真要实现,得整合Linkedhashmap和concurrenthashmap的功能于一身,淘宝的人这样做过。再来说一下网络通讯,memcached和redis不约而同的使用非阻塞IO epoll,前者使用libevent,redis在libv的肩膀上简化了*。我就不用BIO的RMI了。
说到分布式文件,你会想到那些HDFS,GFS,TFS等等还有好多,还是回到4in1中的fttp,网络通讯怎么玩的呢?fttp,http名字一个字母之差,会不会是http啊,恭喜你猜对了,这时你可能要怀疑,http client好办我用httpurlconnection就可以解决,那http server呢作者内嵌jetty,作者可是号称不依赖任何第三方jar啊难道自己实现一个http server?小伙伴们我们又错了,作者很高端,采用JDK6以后自带的httpserver,关于这个httpserver。这样就可以通过http上传下载文件了,那你说我用jetty和httpclient分分钟就可以分布式文件了,优越感油然而生,信心瞬间爆棚!首先说一下httpserver我读了一下代码,感觉类似还是比较粗放,和Netty没发比,Selector的使用,为了不影响accept事件的阻塞,读写事件都注册到另外一个selector上处理,这样每一个request就会有一个selector,当然作者也才了selector池的处理,使之能够重复使用,但高并发下还是会有很多的selector,而且也会带池的锁开销,再说一下内存管理,每个request都会创建一个buffer,并没有实现内存的管理,这块很粗放,在高并发时GC负担一定很大,感兴趣的小伙伴可以看看netty的实现,作者写过一篇blog说用一个类似伙伴系统和slab内存管理相结合的内存管理方案减少GC。这些且不表,你用过必须制定host以及文件目录的分布式文件系统吗,读写文件时,必须清楚地知道文件在那台机器的那个目录下,orz,这样就要崩溃了
聊了这么多,小伙伴们也可能觉得我对4in1有偏见,其实不然,我只是觉得作者把这些类似玩具的东东开源并推广给大家,并号称分布式,有时也冠以淘宝的名号,大家都知道淘宝在国内开源的影响,小伙伴们很容易会从盲从,特别是不了解分布式想向分布式方面发展学习的小伙伴们,请大家要一定要擦亮眼睛啊。国内开源的分布式不多,讲分布式的书也不多,就那么几本,在此向大家推荐杨传辉的那本书《大规模分布式存储》,书中对主流的分布式kv,分布式文件系统,分布式表格数据库等都有详细的介绍。
我曾经加到4in1的企鹅群,问了一句“4in1在淘宝那些场景下用到了,好的项目是经得起质疑的,实践是检验真理的唯一标准”结果我被踢出了群,在OSC以及ITEYE也看到一些同学问道了相同的问题,结果也是同样的下场,我不禁要问,作者是抱着什么样的态度开源呢,是跟大家分享,给大家带来便利,还是忽悠,然后写书忽悠?
4in1中的并行计算,hadoop没研究过不懂,本文只针对分布式缓存和分布式文件系统
好了回归主题,说一说分布式缓存,主流的分布式缓存我们知道用memcached、redis这两个都很出色,fourinone的分布式缓存类似memcached,只支持kv存储。那他是怎么是实现呢?说到kv存储,HashMap是不二之选,对4in1应该也是用的LinkedHashMap,LinkedHashMap,用额外的链表记录访问顺序,LinkedHashMap提供了一个接口removeEldestEntry,使在插入时有机会删除那些最近不活跃的entry,ok继续,分布式缓存,那网络通讯怎么玩的呢?当然是我们前面提到的RMI。至此了解了分布式缓存的实现,简单吧!我相信各位看官看了我的描述自己也能实现了一个自己把玩一下。
继续,说一下这样做的问题,分布式系统几乎是为了高并发而设计的,memcache,redis都是这样。HashMap在高并发下又会怎么样呢?我想你此时脑子里会出现一个场景,这是一个坑,HashMap不是线程安全的,在并发情况下扩容会导致死循环从而导致cpu100%。不了解的可以在coolshell上搜一下,或者问度,这是个致命的问题,我不知道作者是怎么解决的,同步加锁,我没有看到sync,用concurrenthashmap貌似也没用吧。因为concurrenthashmap虽然是线程安全的,但是却没有LRU的功能,如果真要实现,得整合Linkedhashmap和concurrenthashmap的功能于一身,淘宝的人这样做过。再来说一下网络通讯,memcached和redis不约而同的使用非阻塞IO epoll,前者使用libevent,redis在libv的肩膀上简化了*。我就不用BIO的RMI了。
说到分布式文件,你会想到那些HDFS,GFS,TFS等等还有好多,还是回到4in1中的fttp,网络通讯怎么玩的呢?fttp,http名字一个字母之差,会不会是http啊,恭喜你猜对了,这时你可能要怀疑,http client好办我用httpurlconnection就可以解决,那http server呢作者内嵌jetty,作者可是号称不依赖任何第三方jar啊难道自己实现一个http server?小伙伴们我们又错了,作者很高端,采用JDK6以后自带的httpserver,关于这个httpserver。这样就可以通过http上传下载文件了,那你说我用jetty和httpclient分分钟就可以分布式文件了,优越感油然而生,信心瞬间爆棚!首先说一下httpserver我读了一下代码,感觉类似还是比较粗放,和Netty没发比,Selector的使用,为了不影响accept事件的阻塞,读写事件都注册到另外一个selector上处理,这样每一个request就会有一个selector,当然作者也才了selector池的处理,使之能够重复使用,但高并发下还是会有很多的selector,而且也会带池的锁开销,再说一下内存管理,每个request都会创建一个buffer,并没有实现内存的管理,这块很粗放,在高并发时GC负担一定很大,感兴趣的小伙伴可以看看netty的实现,作者写过一篇blog说用一个类似伙伴系统和slab内存管理相结合的内存管理方案减少GC。这些且不表,你用过必须制定host以及文件目录的分布式文件系统吗,读写文件时,必须清楚地知道文件在那台机器的那个目录下,orz,这样就要崩溃了
聊了这么多,小伙伴们也可能觉得我对4in1有偏见,其实不然,我只是觉得作者把这些类似玩具的东东开源并推广给大家,并号称分布式,有时也冠以淘宝的名号,大家都知道淘宝在国内开源的影响,小伙伴们很容易会从盲从,特别是不了解分布式想向分布式方面发展学习的小伙伴们,请大家要一定要擦亮眼睛啊。国内开源的分布式不多,讲分布式的书也不多,就那么几本,在此向大家推荐杨传辉的那本书《大规模分布式存储》,书中对主流的分布式kv,分布式文件系统,分布式表格数据库等都有详细的介绍。
我曾经加到4in1的企鹅群,问了一句“4in1在淘宝那些场景下用到了,好的项目是经得起质疑的,实践是检验真理的唯一标准”结果我被踢出了群,在OSC以及ITEYE也看到一些同学问道了相同的问题,结果也是同样的下场,我不禁要问,作者是抱着什么样的态度开源呢,是跟大家分享,给大家带来便利,还是忽悠,然后写书忽悠?
4in1中的并行计算,hadoop没研究过不懂,本文只针对分布式缓存和分布式文件系统
上一篇: 2013技术博客汇总贴
下一篇: wait-notify的另一种情况