Java8 开源后端项目寻赞助或合作

2014-04-09 20:00:34 +08:00
 jinmingjian
大家好,我是一个开源后端项目(LANDZ)的创建人。因为本贴不是讨论具体语言,该项目也没有正式发布,我暂将此信息发布在这个节点。


该项目上周实现了“自我驱动”,也就是项目的网站使用LANDZ自己的web栈运行,项目的网站在: landz.org
(run在米国的独服上,最近一周来联通访问都很慢,据信海缆未完全修复)
(另:页面尽量做到responsive,但小屏幕访问可以预见会有些排版问题)


1. 简洁。基于Java 8(和“可以在Java8上运行”是两个概念,本项目应该是全球第一个Java8使用比较充分和成熟web栈项目,但我karma很低,发HN没有意义),Java8在源码层支持函数作为第一公民,可读性接近动态和函数语言(大家有意见的话,我们可以探讨)。

2.高性能。该项目提供如下API:
A. Channel API提供wait-free/lock-free的线程间通讯(ITC)。其中,HyperLoop提供一个数据结构版的(简化)Disruptor RingBuffer,其roundtrip延迟比Disruptor小50%到一倍,最大通量相近;再如,MPMC提供第一个开源Java领域的无锁多生产者多消费者队列的实现(目前我所见过2个其他实现都有严重的潜在多线程bug),其不竞争情况下在mobile i7上即能提供每秒50M端到端消息,高于AKKA的AbstractNodeQueue(MPSC队列)。
B. 无锁/零复制/零垃圾的线程安全OffHeap内存分配器zmalloc。在单/双线程测试中,分配/释放速度比native的jemalloc/ptmalloc更快,是Netty ByteBuf的20倍以上;
C. 基于zmalloc的Buffer API,支持不检查边界,比Netty ByteBuf快30%;
D. 基于JFFI的ZNR(Z本地运行时库),提供比传统JNI更快和更干净的系统调用及Sockets栈支持(只支持Linux/x86-64)
E. 零overhead的契约API和异步logging API(未发布)。

3. KISS和可组合的API。
A. 层次化API设计,既有底层的性能,也提供类型安全接口,避免过度工程和隐藏。

4. 工程维护和运维。
A. 支持模块。将来会有一个滚动更新(rolling update)的模块仓库。
B. 基于Nashorn引擎的脚本(第一公民)支持,提供构建,测试,部署(这3项已初步支持),监控和运维支持。

5. 完整的支持REST的HTTP栈 - Z-stack
未发布。但特点有:
A. 手工的HTTP消息解析器,比Netty的3倍,比nodejs的5倍(比较的是修改过的java移植版,但我相信nodejs的本尊快不了多少,因为修改过后已经比原来快了1倍,还没有加callback)
B. 定制的lock-free异步线程池
C. 768M堆设定下,进行TechemPower测试时,无fullgc,younggc停止时间(stop-time)小于总时间的千分之1(需要在可用性上做平衡,REST栈并不是全OffHeap设计,但TCP栈已可以做到长时间无GC);
D. 在基于TechemPower测试集的plaintext本地测试中,通量是Netty的1.3倍(延迟有相同幅度改进)。(注:在TechemPower的测试中这项测试中,前几名通量近饱和,所以区分度不大;需要区分的,请看round 9的Peak硬件上的测试结果。)


和一些项目的比较:
1. Netty
Netty有10年的历史,很多中国开发者知道、使用或分析这个框架。Netty的设计属于典型的框架,在其之上的应用需要继承一些类和实现一些方法。Landz在设计上恰与Netty反向,Landz强调API的可组合,所以,Landz之上的应用是从高到低组合不同层次接口来实现。Netty在多线程方面,除了通用IO线程池方案,并无明显优化,其其同步方式主要靠AtomicX类(类自旋锁)和同步关键字。最新的ByteBuf分配器使用同步关键字作为全局池访问的同步机制,在多线程测试中效率低下。Landz强调多核/可伸缩/可组合的架构,同时提供工程上的支持(比如脚本),其意在重塑Java后端工程(当然现在属于YY),这和Netty完全不同。

2. 云风的skynet
c语言框架。有些设计思路异曲同工。虽说是游戏服务器,但不以通量为其设计目标。同时,Landz强调无等待/无锁的多核可伸缩架构,但我印象中skynet里主要是用锁。

3. 陈硕的muduo
C++网络库。本身是有是思想的。作者明确说明不以性能为设计目标,但其测试显示性能比ningx要高。其强调了多线程,但我仅仅看到了一些IO线程通用设计说明。其具体通量性能可对比nginx在TechemPower测试中的排名(http://www.techempower.com/benchmarks/)做参考。

(列出上述项目,仅因为我印象中v2上有人提及,想必有一定群众基础。其实现实中还有很多类似项目,比如techempower上的若干,你会发现c+lua不只是skynet一家开源)


最后,想法:
1. 该项目的方案,在去年年中其实和v2上一位创业公司的总监聊过,人家估算我这个项目要做2年(也可能是人家架构师不喜欢我),没有谈成。当然我知道在中国做开源是件很难的,也感谢这位负责人至少在我们交谈中能很认可开源。

2. 项目做到现在,我希望在v2上(公司无论大小地点)能找些合作或赞助。我可以承诺的是,比您现有业务更大的并发及通量(两者并非一回事,同时并发这个概念也很有说法)和随之而来的更少的机器。其结果不一定涉及钱,也可以是您愿意LANDZ在其主页上留下贵公司的名字。

若有意向,可联系我,感谢:jin.phd at gmail.com
7029 次点击
所在节点    求职
28 条回复
hepin1989
2014-04-12 02:41:45 +08:00
```
除了通用IO线程池方案,并无明显优化,
```
还有这个,因为NIO的JDK实现是有锁的,所以他们写了个Native的,然后里面没有锁,因为他们的线程模型保证了不会竞争,所以在Native的实现里面没有锁,也算个优化吧,还有全新的Bytebuf也算吧,codec也优化了。
hepin1989
2014-04-12 03:02:17 +08:00
话说您可以用您的框架做个类似V2ex的网站来作为您的Group,google group的访问的确不行。一方面可以证明您的框架OK,另一方面也可以有新的思路。
jinmingjian
2014-04-12 13:12:48 +08:00
感谢,这两天是上来瞅了眼,但仅仅是看到首页没有人@我,就没有深入看。我自己也不想挖“坟”,自己顶自己很无趣。刚看到hepin1989在github开了issue,就必来自v2,想进来看看,没想到L大也留了言!:)

@Livid
这满满都是经验啊,再次记下!

其实也有考察:)模板是个很有意思的话题,从JSP到xxxJS,有很多层次都试图用自己方式解决这个问题,我其实不想将项目做成框架,所以我暂时(其实是没有时间)倾向于,表示层的东西可能放在表示层(客户端)做更好,而且JS似乎已经有很多不错的表示层(模板)框架。

异步是很关键的,也是框架是否高效的一个重点。很多框架并不在意这一点,这里很多原因,我希望有时间我可以具体写写什么会这样,以及可以怎么样。

@hepin1989
我看你给Netty提交过bug修复?90前的后生可谓:)而且作为四川女婿的我也要给你点个赞:)

应该不用翻墙,不排除你的四川运营商有什么问题?只是个技术网站的静态网页,应该不至于。


Spray我的确研究过,前文我没点名,但正是Spray有自己手工的HTTP,最后促使我决定也写一个更好的轮子,不然网站进度不会拖到4月:)

Netty的Codec并不值得学习,甚至Netty整个框架式的架构方法,也从工程角度讲,不值得提倡,当然这是我个人看法。这些都是比较上层的东西或者说比较虚。真要学,Spray甚至Undertow都比Netty强。

关于github上的文档,感谢你的指出,确实是这样。原因其实我说了,但没有说太明白。wiki倒是反映了要或已经做的东西。在此,我合并你说的ByteBuf和线程模型在此给出一个说明:

1.
ByteBuf如你说所在最近进行了一项改进,优先在一些本地分配。我不知道你测试过了没有。但据我测试,性能不仅没有明显改进,allocate时还有严重退化(landz上有关于netty的测试,你可以自行比较)。我并非Netty的义务测试员,在此我暂不多谈。分配器是一件很难做的东西,据我所了解,jemalloc的一些关键设计,Netty并没有实现。除了线程安全问题,就性能看,ByteBuf还有很多明显设计败笔。Netty的ByteBuffAllocator是我看过的netty缺陷的最大的一堆代码。Netty意识到了在on-heap上分配Buffer带来的严重的GC问题,但它确实没有做好这件事(或者至少离理想水平的差距还很大)。

“线程模型保证了不会竞争”其实是很容易的,问题是这种线程模型是不是最优?你的用户线程是分离的还是和IO线程合一的?如果用户逻辑阻塞怎么办?如果你看了昨天淘宝某位哥哥在Netty上的帖子,你会承认Netty现在的这种模型恰恰有严重缺陷。你可能也知道,现在Netty正在讨论FJ池的可能性,这其实是我去年年底已经思考和研究过的,FJ确有其高明之处,但不是银弹,而且用不好会很“扯淡”。我现在有个还在进行中的通用异步池设计,可以类比FJ+AKKA的Actor。。。如果告诉你,连star300多的github项目都使用错误的lockfree队列实现(而且是经我提醒改过一次),连淘宝高工发表在Infoq这样网站的lockfree算法分析文章都有错误,要做好一个原创的、通用的、高效的池,大家都能理解,“想必是件极难的事”(OK,我应该说人话)。

2.
之所以新的代码没有发表,我就更明确的说,因为框架之间也在竞争。不能说ByteBuf的改进是因为Landz的zmalloc的竞争,但我看出,最近Netty展现出了快速的学习能力。我在Netty的讨论组里,Netty的两位全职作者也在landz的讨论组里,这就是事实。那什么时候commit新的代码呢?我猜在5月底左右。其实现在已经有很多好东西,当然也有一些重要改动,这也是开源的魅力。但最后,我相信你能对我的种临时性的发布策略(1.0发布后,landz将在github上持续维护)给予理解。
hepin1989
2014-04-12 13:40:04 +08:00
@jinmingjian
1,google group我这里是打了Host补丁的,不过还是会遇到偶尔访问速度啊,或者其他的一些问题
2,netty的Codec的好的地方是他又很多常见的Codec,也很好扩展,如果您要推广,那么肯定得多写几个常见的Codec
3,netty的Bytebuf主要是在Iobuffer的时候使用,快很多。有个Netty Best Practices with Norman Maurer.mp4,在Youtube上,您可以看下。
4,如果Netty的Allocator有明显的缺陷,我想如果您提交下补丁可能对国内那么多用Netty的人是个帮助,也是个好的切入点,印证了“我想改进Netty这个轮子,我也改进了,但是我打算制造一个更好的轮子”。
5,的确打算用FJ,不过既然不是银弹,所以还有其他要考虑的地方,线程模型的确是非常难的。
6,好吧,您觉得有竞争我就没办法了,但是我建议您有个更开放的心态,Netty没有开放出来的,只有部分的Codec,但是基础代码是开放出来的,我想如果您以一个开放的更加包容的心态来弄的化,可能更好,当然如果您可以狠狠的鄙视Trustin和Norman一把,那么我们也算沾光啦。就目前我已经很少使用Netty了,而是采用的Akka+play来做,因为开源,以及开放的开发,可以更好的参与以及获取项目的最新进展,您的东西的确好,但是大家看不到,我昨晚花了时间把您的Google Group的帖子看完了,也大概浏览了下代码,帖子写的很好,但是代码吧,至少写法上不是很规范,注释掉的代码没有清除掉,没有开头的声明也没有太多的注释,所以对于想要一窥的人来说,可能也是多少有点不太方便吧。
7,不管怎么样,我还是很关注和支持的,但是我还是觉得,您给Netty发下PR可能可以获取更多的关注。
hepin1989
2014-04-12 13:41:51 +08:00
还有一点
```
异步是很关键的,也是框架是否高效的一个重点。很多框架并不在意这一点,这里很多原因,我希望有时间我可以具体写写什么会这样,以及可以怎么样。
```
异步不一定是高效,这里逻辑有点点。。。
hepin1989
2014-04-12 13:51:14 +08:00
@jinmingjian 楼主对发版本的想法可以用一句话来形容:“不鸣则已,一鸣惊人!”还有那个HttpCodec的ThreadLocalPool,我直接感觉和Play-java的HttpContext差不多了,都这么用,不过TL是有消耗的,真的可以优化。而且您的ByteBuffer提供的功能的确不多,以及您也没有按NIO的方式来实现Native。
当然我看到的都是您的老代码了,支持了。
jinmingjian
2014-04-12 14:52:27 +08:00
@hepin1989

感谢,我是有信必回。

我并不喜欢重造轮子,我喜欢的是“造更好的轮子”。我正是觉得韩国哥哥开发的netty,是离软件工程的最佳方式差距还很大,所以才有了landz。两个项目开发理念,甚至开发者的口味,真的差很多。

不瞒你说,我小范围发布之初,和韩国哥哥Trustin Lee有过通信,开始大家是觉得可以合作的,但后来,我指出Netty在工程设计上的各种问题以及如何改造之后,人家不联系我了:)我的理解是,你至少可以回一句“对不起,改动太大,不可行”,都让人可以接受。为什么不说话呢?此时,你会不会上杆子贡献补丁呢?

中国开发者完全可以做的更好,为什么不呢?

当然,这里扯“爱国”牌,不太对。但是,不破不立。按你的意思,JBoss不应该开发Undertow,Play也不必换到Spray。为什么我不想解释太多,因为我预计到,“应该有个开放的心态”这个大帽子很可能会扣上。到现在还没有,一可能是我觉得是v2上的程序员给我面子,二可能大家不太care这个项目:)但你提出来了,我还是想回复一下。

至于他家ByteBuf,我自然相信比以前在堆上分配要强。但你要看和谁比?而且快还是慢,应该由测量来说话。我所说的具体数据,我必有开放的测试让大家都能验证。如果你有横向测试代码,我愿意帮你分析一下(虽然,我没有太大兴趣)。

Norman的ppt我看过,还好,但对熟悉网络io的人来说,属于比较直白的介绍性文字。

异步确实不一定是高效。因为,这东西太多在此无法展开。通常的认识是,同步调用(也就是现在大众程序员使用的方式)难以规模化到多核。当然,异步概念本身也有人较真。异步、并行、并发、非阻塞。。。我猜你喜欢AKKA的Actor,但你有没有思考或遇到过Actor有没有什么问题?出了问题,你一般是怎么处理?如果要你做,你能不能做的更好?

我觉得,你和我一样是位爱思考的程序员,如果这个帖子能找些有相同兴趣的人做些事,我觉得是它最大的用处。
hepin1989
2014-04-12 15:33:38 +08:00
@jinmingjian
1,我倒不是说您在造更好的轮子不妥,而是目前别人的轮子修修补补您也可以发现更多的问题,所以如果你有空,可以提交下PR,按照别人的思路,在别人的工作上改进,而不是推倒。

2,Trustin那人可行吧,但是我感觉他不喜欢别人觉得比他聪明。您可以看下他目前Netty 还是Open的Issue,然后您可以试着关闭下Issue,也就是提交PR,还有呢我觉得还是不要介意别人没有回复您的邮件好,当初我问了很傻比的InstanseOf的性能别人都回复了,所以我觉得应该不是太大的问题,如果别人忘了回复邮件或者其他的通信方式,完全没必要介意,毕竟开发者不是他一个很多人都有合并权限的。

3,的确可以做得更好,但是妹的,又是房贷又是老婆孩子,还得有自己的生活吧,所以,时间的投入可能的确不如别人,加之整个环境,所以国内的开源难做和很多其他的事情一样

4,我不是说不应该破旧立新,而是说在破之初,可以有不同的切入点,比如您现在的这个项目,知道的人不多,你可以将您的独特思考以及共享回馈到目前的主流项目,这样也可一石二鸟,多方受益。Undertow我没用,但是Play换到Spray有多个原因,1,Spray用的Scala和AKKA,2,他们好管理以前不好管的线程池,3,他们收购了Spray,但是目前不也没用么,Akka-http在Akka2.4的时候肯定还是实验班,而到akka2.5的时候还不知道究竟如何,何况Akka的ReactiveStream也还没出来,Play项目负责人也说了,可能会提供一个抽象层,Netty和Akka两套Backend。他们目前没换,也说得很清楚,要等到他们的至少和Netty的差不多了再说。他们还是把他们的一些改进合并到了上游,比如HashWheelTimer以及目前对Async-Http-Client的改进,都是合并到了上游的,当然这和你这个不同,因为您另起炉灶,和他们用别人的改进别人的还是不一样的。

5,可能他家的Bytebuf在DirectBytebuffer上的分配不如您的,不过别人的还是很好用的,我看您的接口时Bytebuffer,但是不是JDK的bytebuffer,建议呢就是还是适配大家目前已知的东西比较好,当然这个是个设计上的考量。我倒是不会提交测试代码,因为我自己也没兴趣,现在机器便宜了,可能多个机器的收益更好,更需要考量的是这个框架好用否。

6,其实直白的文字来说,更容易引起大家的共鸣,将复杂的问题用简单的方式讲出来才是高手,他那个简单的PPT不是说他肚子里面就只有那么多墨水,而是他给我们普通的开发者,或者新手在很短的时间内接触和了解netty的机会。比如几分钟内介绍您这个框架如何好,为什幺采用,如果能够打动人,那么就是真的厉害,不是么?一个好的PPT可以煽动人的。


7,我倒不是喜欢Akka的Actor模型,但是它的确让我有醍醐灌顶的感觉。并发的几个思路也不多对吧,多看点,思路也更开阔点,比如Go的http://en.wikipedia.org/wiki/Communicating_sequential_processes 和Akka 的 http://en.wikipedia.org/wiki/Actor_model
都是不同的思路,而且目前Akka加了Eventsource也就是Akka-persistence,我觉得也可以引发更多的思考,对于我们单个开发者来说,可能我们不会用也不会深入某些技术,因为精力有限,但是学习下别人思考和解决问题的思路的确对自身还是有很大的启发,我目前还没有遇到很奇葩的问题,也就是通过别人提供的解决方案没法实现的,所以思考的少,但是如果遇到了,我会去Group 问的。

8,最后的建议就是,做减法,永远比做加法难,愿你的框架做到极致。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/107879

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX