smart-socket 简介
smart-socket,一款能够轻松实现单机百万长连接的国产Java通信框架。
smart-socket立项之初便以极简
、易用
、高性能
为设计理念,力求打造出对开发人员友好,对硬件利用率极致,能够拥抱未来更高性能要求、更复杂并发场景的开源作品。
-
极简:开源至今发布了数十次版本,核心代码量始终控制在2500行以内,总代码量不足5000行。
-
易用:5分钟上手(前提:未曾遭受网上错误编解码知识的毒害)
-
高性能:以算法之力充分驱动硬件算力之势,基于smart-socket的服务在通信性能方面可轻松超过其他计算机语言开发的程序,包括且不限于:C/C++、Golang、Rust、Erlang。
就在近日,作为本项目的作者,在 Gitee 上亲手为这个项目点下了第 4000 个 Star。
随后翻了一下 Commit 记录,才注意到这个项目已经一路走了8年。
当初创建这个项目的时候,从未想过会坚持维护这么多年。甚至当初为项目起名字的时候,都是草率的定为:smart-socket。在之后的开源中,不少人反馈这个名字真不咋滴,换个名字说不定知名度更高。
可我偏偏不太在乎这种事,反而一直延用这种风格,先后创建了:smart-http、smart-servlet、smart-mqtt等等。虽说这样确实很草率,但也省去了起名字的烦恼。
发展历程
回顾 smart-socket 过往的发展经历,它在不同的阶段都伴随着不同的目标,并取得了不同的成果。如今的它,与刚开源的时候完全是二般模样。
阶段一:立项
虽然 smart-socket 在 Gitee 上的最早提交记录是2015年,但实际上它立项时间在更早之前。因为那个时候「开源」这件事并不像如今这般火热,我也不知道 Gitee 这个平台(那个时候还叫:码云)。
smart-socket 的立项缘于当初的工作经历,那时从事的正是通信相关开发,用的也还是最原始的 BIO 技术。
那个年代的“高并发”,更多的还得依靠堆硬件、开线程来支撑。NIO 算是一种比较先进的技术,懂的人不多。而且搜索相关资料的时候,除了能够看到 BIO 和 NIO 的优劣对比,通常还伴随着一个奇怪的建议:不建议程序员自己编写NIO程序,推荐使用mina、netty等框架。
作为一名从业不久的年轻人,最听不进去的就是网上那些建议。考虑到今后 BIO 势必被淘汰,NIO 才是主流。何不自己边学习,边做一个 NIO 项目。
就这样,smart-socket 诞生了!
阶段二:摸爬滚打
对着网上的原理讲解和 demo 示例,很快就完成了一个可运行版。可一旦进行压测,就开始暴露出一系列问题。这个时候才意识到要做一款 NIO 框架,仅掌握 IO 原理是远远不够的,关键得具备并发思维。
在开发通信类框架的过程中,“调试”这项技能经常失灵。只能依靠在脑子里推导各种并发场景下,一行行代码在 CPU 中交错的执行过程和结果。
尽管这个过程痛苦又漫长,却明显感受到对于并发编程的掌控力日益娴熟。smart-socket 也变得越来越有模有样,各种暴力压测得出的结果总能让自己感受到成就感。
阶段三:转型 AIO
当时间进入到2017年,AIO 突然在社区中火了起来,“百万级”这种夸张的宣传字眼随处可见。基于 NIO 实现的 smart-socket 也只是停留在十万级的体量。我一度以为 AIO 是一项革命性的技术,故决定重构 smart-socket,正式转战 AIO。
花了一个星期的时候,smart-socket 的重构工作便完成了。因为 AIO 的线程模型由 JDK 封装好了,所以改版后的 smart-socket 看上去非常简洁明了,代码量也仅四五百行。
但是,很遗憾,并没有复现所谓的“百万级”连接。最终经过差不多2年的研究,让我证实了“百万连接”就是一个巨大的谎言。
原生的 Java AIO 提供了一个非常优秀的设计思想,可惜在实现上存在缺陷。使其不适合海量连接,也发挥不出极致性能,或许顶配规格的服务才有可能实现百万级连接。曾试图给官方反馈其中的缺陷,奈何语言不通就不了了之了。
阶段四:归回NIO,增强 AIO
自从找到了原生 Java AIO 的缺陷,自然也就想到了应对之法。考虑到无论是社区,还是官方都不太可能留意到这个问题,因此这个缺陷必将长期留存于 JDK 中,所以决定自己用 NIO 重写 AIO 接口的实现。
因为有了多年的沉淀,这个重写的过程也是比较轻松。完成之后第一时间将其应用到 smart-http 中,并在 techempower 评测中获得了非常不错的成绩。这也让我意识到平常看到社区中关于 C、C++、Golang、Java 之类的语言性能评测是存在误区的,Java也是能够写出高性能的程序。
通过比较原生 Java AIO、增强后 AIO 和 Netty,可以看到通过 NIO 增强后的 smart-socket 在高并发下的性能表现有了质的飞跃。
除了性能提升,我们还成功实现了百万级长连接的测试。
服务端的内存消耗也只有区区 3.1G。在没有亲自验证之前,难以想象 Java 语言能做到如此程度。
更新内容
最近一年 smart-socket 在功能上都没有大的变化,发版也基本从简。本次趁着 Star 数破 4000 就稍微意思一下。
这次发版的更新内容主要为了支撑 smart-mqtt 的百万级连接,服务中会存在海量的定时任务。据说时间轮定时器更适合此类场景,而 netty 中已提供了相应的实现,所以此次 smart-socket 从中移植了核心算法并加以改造。这算是 smart-socket 开源以来同 netty 的首次梦幻联动。希望在后续的实测中,它能发挥出预期的效果。
下一步的规划
如今很多项目在短时间内就能获得几千上万的 Star,samrt-socket 却历时 8 年才拥有 4000,这已经算的上在项目推广运营方面的失败了。而这正是作为一名普通程序员,在编码技能之外表现出来的普遍短板。这个短板估计短时间内难以解决,也有可能永远克服不了。期望通过做时间的朋友,在下一轮 8 年能使其有所改善。
至于 samrt-socket 功能方面的规划,暂时没有太多想法。目前列出的也仅两项:
-
适配高版本 JDK。只不过现在还没看到升级 Java 版本的必要性,作为一名老 Javaer,对这门语言这几年的发展表现还是略有失望。
-
持续改进性能。身为 smart-socket 的作者,我隐约觉得它在性能方面还剩余一丝提升空间可以压榨。只不过这种改进不会对实际生产场景产生影响,只能让实验压测数据表现的更好看一些。
或许等到一个合适的时机,我们将会迎来又一个不一样的 smart-socket。这就是开源的趣味:它还是它,可它又不再是它。
还没有评论,来说两句吧...