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
7027 次点击
所在节点    求职
28 条回复
terrytowne
2014-04-09 21:00:15 +08:00
看起来像是Netty + Vert.x + Spring Boot的综合体。
Java 8看起来还是一个过渡性版本,要搞FP还是使用Scala、Clojure。

项目太实验性,会投入很多和收益很少……
jinmingjian
2014-04-09 21:31:38 +08:00
@terrytowne Java8在Java演化中不可能是过渡性。相反很多规划中的Java9依赖Java8的革命性。

我做过Scala的表示层解析器,其可以表达的复杂远超一些的纯fp语言。更深层的讨论恐怕太主观。

至于,项目实验性不知从何谈起,很多技术都是高性能Java讨论的热点,只是中国开发者很少讨论。其实landz 在春节做过一次发表,Netty的韩国哥哥已经对他们自己产品Bytebuf性能做了点评。

但我一直有个想法,为什么在一门主流开发语言上韩国人开发的框架可以看到中国人时不时贡献补丁,而中国人却没有?我想,你说的“收益”确实是很好的解释。
jinmingjian
2014-04-09 21:49:47 +08:00
另,Jboss已经使用全新的Undertow;play!框架正准备从netty迁移到另一个Scala REST栈。我虽然对比的是NETTY,但并不是说Java后端在设计上必须以Netty为榜样。

其实,你说这几个框架如果是个裸的,我不知道能干什么,但Landz的最基础的kernel支持库的方式使用。我写的所以Api除了网络层的,全在kernel里。
feilaoda
2014-04-09 22:00:51 +08:00
写了不少代码啊,貌似代码不全,无法评价。

在真实环境用用,用的人多,才能流行。
terrytowne
2014-04-09 22:05:40 +08:00
@jinmingjian Java基因里面就没有Lambda表达式,你也可以看到Scala融合的多么困难。在短期内,Java 8引入Lambda表达式的作用只相当于语法糖,深层次的革命还远远没有开始。

Java作为一个工程型语言,对于热点往往是不敏感的。你若是能做成OpenResty那样的项目,自然有人来捧你。

Java 8 引入Lambda,Java 9会引入Jigsaw,比对Java 5的Generic、Annotation变革到Java 6才成熟,我猜这些新功能到Java 10才会流行。

Java虽老,变革不小,且学且观望吧~ 没必要太着急……
pythonee
2014-04-09 22:16:21 +08:00
说的这么多,能不能一句话介绍一下

另外,看着挺感兴趣的,希望可以深入了解下
terrytowne
2014-04-09 22:21:14 +08:00
当然,这个项目看起来还是很屌的,有空会学习;也希望项目能找到投资和伙伴,能让它继续下去!
blueware
2014-04-09 22:30:28 +08:00
明天上班发邮件给您。
thinkxen
2014-04-10 08:40:53 +08:00
过两天我可以赞助一台香港vps主机。
jinmingjian
2014-04-10 08:51:47 +08:00
@terrytowne 你说了部分事实。Jigsaw的难产,是件很尴尬的事情,其实Jigsaw设计的已经比较简单。但对于巨大单一的Java运行时来说,困难还是不少。Java8推出了compact profile,我机器上cp1的大小是20M多点,不知比其他语言的运行时大小如何?再比如,你提到Annotation,Java8引入了type annotation,这个特性较少被人提及,但其实是一个潜在的很有用的设计,它允许annotation一般性的出现在代码各个的地方,这就允许对代码中的很多地方进行约束和检查。java8的革命性,我以为是超出Java2以来的任何版本,但我承认新功能在Java圈里流行相当慢。Java社区也能引领前沿,正是我的一个期待。

> Java 8引入Lambda表达式的作用只相当于语法糖。
1. 对于newcomer将lambda看成语法糖是可以的,但lambda的实现原理并不是传统的匿名内部类。这利用了Java7一项字节码增强invokedynamic,该增强为JVM上的动态语言准备;有意思的是,其性能比匿名内部类略强,有兴趣可以看Hotspot VM工程师的一个分享:
http://medianetwork.oracle.com/video/player/2623576348001
这主要2点原因,JIT优化和匿名类(不同于“匿名内部类”),具体展开就多了,我愿意以后在v2的Java节点做些详细介绍,包括一些前沿的做法。

2. Scala和其他的JVM语言其实也收益于Java的改进。
这里有关于Scala使用methodhandle的讨论:
http://stackoverflow.com/questions/14285894/advantages-of-scala-emitting-bytecode-for-the-jvm-1-7

我承认Scala和其他的JVM语言有很多有趣的特性,但从工程角度将这些特性,是否是必须的,还可以商榷。


OpenResty,春哥的事迹有所耳闻:)Techempower的测试里就有OpenResty。我不知道OpenResty对nignx的改进有多少,但nignx本身的epoll模块实现,我撸过一眼,事件处理使用了锁,Techempower的通量测试成绩也低于我的预期。


感谢你的鼓励,我其实是受了投资的“刺激”:)我原计划是准备在v2发第一贴找些有兴趣的同志一起做些事情。我无语的是,种子投资要种子用户,当作为种子的项目它还没有生长出来,种子用户又从何谈起?当然这些是另一个话题:)

最后,不管如何,项目开源会继续,Landz会在round 9过后的某个时刻加入Techempower的测试,原因在测试的论坛上我有说明: https://groups.google.com/forum/#!topic/framework-benchmarks/HH2K8xDut3I

现在committed的部分不包括HTTP栈,同时TCP模块的线程池设计属于实验性的,没有针对通量优化,这是目前可预见的坑。其他部分无坑,有各种测试保证,landz现在的各种测试只比我见到过的开源软件严格,里面甚至还有Disruptor和JDK的bug测试。
jinmingjian
2014-04-10 08:52:36 +08:00
@blueware 感谢:)
terrytowne
2014-04-10 09:24:16 +08:00
@jinmingjian 十分佩服!期待项目的进一步开源!
jinmingjian
2014-04-10 09:29:57 +08:00
@thinkxen 真的太感谢,感谢!其实,我是希望v2的程序员们,能帮我项目在github点个赞,哈哈:)能有以上2位回复,我想v2这个贴已经值了。

我长期潜水v2,最初是从google vps到v2,我觉得v2是个有理想的社区,有时技术性太强我都担心对v2未必好:)

如果 @Livid 愿意,我愿意在异步logging完成以后,帮v2以LANDZ的方式改造下v2(不谈钱),虽说在大规模DDOS面前都是扯淡,但我相信其抗普通攻击和应用内监控分析能力应该能提升不少。

当然,我不建议程序员换语言。所以,如果L大是pythoner或dartisan,请忽略建议。如果一种语言舒服,为什么不用?性能只是诸多因素中的一个方面,因为性能换语言很可能得不偿失。
feilaoda
2014-04-10 10:15:11 +08:00
@jinmingjian 用LANDZ改造v2不现实,你可以实现一个类似的出来,重造轮子,是可以的。
当然,如果实现类似telegram、textsecure的服务端,是最好了。
jinmingjian
2014-04-10 11:34:56 +08:00
@feilaoda 感谢。我并不喜欢重造轮子,我喜欢的是“造更好的轮子”。我还看不出改造v2不现实技术上的原因。难易和现有架构有关。当然,很多其他任何原因都成为不现实的理由。

这使我想起,春节后我回来,我纠结了几天要不要重写个HTTP的Parser,现成的那么多Netty的,HTTPClient的随便拿来一个不就成了?首先,Netty耦合的很紧密,codec/encoder/decoder/util套了几层,把这些提取出来是可能的,多余的垃圾怎么办?这不是LANDZ做事情的方式。其次,Netty的实现方式并不真的高效,只是有些讨巧,Nodejs的parser在合规性上远严格于Netty。最后,我在优化Nodejs的parser时,发现techpower测试靠前的框架都是自己写。易于掌握和完整控制,是LADNZ的哲学。而且写完后,你会发现,写不一定真的复杂(当然其实还是很复杂的)。我承认为为测试优化这并不值得提倡,但这项优化是具有一般性的和普遍受益,它其实很重要。

Landz其实赞成合作,未来有可能和其它框架合作,且行且看:)(如果有,我会在v2上报告下)

但你说的telegram之类,确实是LANDZ的最适合的场景,因为这种消息类服务始终是渴求性能的,最近WhatsApp的架构值得大家一看。
ren2881971
2014-04-10 13:17:50 +08:00
不明觉历。。。
Livid
2014-04-10 21:40:21 +08:00
如果一个网站项目,最后会长到几万几十万行代码的话,要考虑的因素会很多,我就稍微提两个我觉得重要的(不是全部):

* 一个好用的模板引擎:目前 V2EX 在用的 Jinja2 我很满意,功能该有的都有了,extends 机制很利于代码的重用。我相信重用程度越高的代码越有价值。
* 一个好用的异步运算框架:一些复杂的但是又不需要立刻知道结果的功能,需要有一个足够好用的异步运算框架来处理。如果页面上有一些很重的东西,这些东西不仅会拖慢网站,也会是一个很容易被攻击的弱点。

关于抗攻击,虽然说安全的原则之一就是尽量不要讨论做法,但是我还是想说,防御应该尽可能放在离用户近的那层。

那么多大型网站在用 Java/C#,我相信肯定是有他们自己的道理的。在美国这边,收到的大量简历基本上都是 Java 的。

我个人觉得,对于一个新框架来说,或许需要的是用它做一个用户确实会喜欢和依赖的应用,如果这个应用成功了,那么这个框架也就成功了。
hepin1989
2014-04-12 02:22:10 +08:00
@jinmingjian 您好,我很熟悉您这个头像,您的英语很好,涉猎很广也很深入,我看过您在netty的一个Issue上的讨论,很透彻。
我也给Netty提交过代码,对于您的框架,我觉得如果要开源参与,那么至少先得开源,然后作者自己很积极,同时提供更好的文档以及贡献代码的规范以及您的设计思路和里程碑。
再者还要有良好的Issue管理以及审核标准,同时要提供良好的列子程序。

如果您想建立一番不同,那么肯定是得下一番功夫,包括代码质量以及社区,特别是社区,得靠经营的,而经营社区可能比写代码更难。


Netty 以及Spray我觉得时比较具有代表性的,但是看来您的理想是做个类似Play但是比Play更加强大的框架,我相信您肯定可以做到,但是一个人的能力和精力都是有限的,可能群体的智慧更加强大。

目前Netty4比Netty3改进了不少,比如更好的ByteBuf以及更好的线程模型,以及更少的GC。而且还开始通过JNI来提升部分地方,Netty的Codec的确是需要学习和借鉴的地方。对于Spray,您也知道性能并不差,现在又合并到Typesafe啦,马上作为Akka-http发布,会更加的牛逼起来。

目前您在Github上的z-stack
https://github.com/landz/z-stack
最后的提交已是两个月前的事情了,没有很好的Dev Guide以及User Guide,WIKI页也还差点,Issue的管理也有点松散。

还有一句话有舍有得,如果您的框架可以全部开源,相信在初期可能您没什么好处,但是群体是会扩大的,也会有人慢慢的参与进来,当然您损失了您的代码,但是在后面,您会得到足够的光环的,这就是您的得。

还有一点非常重要,如果想要成功,您必须要让您的框架简单,简单和高级的特性都好用,良好的文档,例子以及社区,感谢分享这么多东西,祝您成功,如果Github放更多的东西出来,相信慢慢参与的人就会多了,还有,您可以推送您的sample到techempower,相信会发光的。
hepin1989
2014-04-12 02:30:31 +08:00
您的官网要翻墙才可以出去,在看您的官网,不过您网上说的techempower的跑分,我倒是没看到您的landz。。
hepin1989
2014-04-12 02:37:42 +08:00
```
最新的ByteBuf分配器使用同步关键字作为全局池访问的同步机制,在多线程测试中效率低下。
```
这个需要更正下就是目前已经改进了,每个线程有自己的池,自己没有了才去全局池,才需要同步下。

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

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

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

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

© 2021 V2EX