AeroFS 开源 SSMP 协议,包含 Java 和 Go 实现
AeroFS 团队今天开源了 SSMP 协议,SSMP 也就是 Stupid-Simple Messaging Protocol,里面包含协议规范,Go 实现,Java 实现和服务器加载测试工具。
XMPP 历史
XMPP 在 AeroFS 有一段很长的历史了,是 AeroFS 过去 5 年点对点覆盖网络的关键组件。AeroFS 用 XMPP 来发现点,跨 LAN 域多播,通过可靠服务作为一个信号频道来建立点对点连接。
一方面,XMPP 可以完成工作。另一方面,XMPP 非常复杂冗长,还有很重的扩展。
ejabberd 可以完美的支持 XMPP 和 XMPP 的各种扩展。非常稳定,但是非常占内存,每个用户常占内存大约为 500kB,而我们其他服务的用户数量在不断增长。
CPU 使用也是非常高,而 AeroFS 团队希望能有一个低流量的服务。更糟糕的是,有一段时间内存泄露非常严重,每天要依靠 cron 作业来重启一次。
XMPP 产生
AeroFS 在寻找各种解决方案,准备起草一份简单的规范协议。
像 MQTT 和 STOMP 协议都非常不错,但是还不够简单。EventSource 规范已经非常接近目标,而且过去也被验证是很不错的。不幸的是,不能允许请求和时间在同一个连接上交叉。
最终规范看起来大部分来自流行的基于文本的协议,比如 HTTP,SMTP 和 STOMP,但是很明显更小更简单了,因为有着更短的 ABNF 语法:
message = ( request | response | event ) LF request = "LOGIN" SP id SP id [ SP payload ] | "CLOSE" | "PING" | "PONG" | forwardable response = code [ SP payload ] event = "000" SP id SP ( forwardable | "PING" | "PONG" ) forwardable = "SUBSCRIBE" SP id [ SP "PRESENCE" ] | "UNSUBSCRIBE" SP id | "UCAST" SP id SP payload | "MCAST" SP id SP payload | "BCAST" SP payload | compat compat = verb [ SP id ] [ SP payload ] code = 3DIGIT verb = 1*UPALPHA id = 1*ID payload = 1*PAYLOAD ID = UPALPHA | LOALPHA | DIGIT | "." | ":" | "@" | "/" | "_" | "-" | "+" | "=" | "~" PAYLOAD = <any 8-bit value, except US-ASCII LF> UPALPHA = <any US-ASCII uppercase letter "A".."Z"> LOALPHA = <any US-ASCII lowercase letter "a".."z"> DIGIT = <any US-ASCII digit "0".."9"> SP = <US-ASCII SP, space (32)> LF = <US-ASCII LF, linefeed (10)>
AeroFS 团队把它命名为 "Stupid-Simple Messaging Protocol" (SSMP)。
顾名思义,SSMP 相比其他开放消息协议是非常简单,非常易懂的。比如消息确认和通配符订阅。AeroFS 团队主要的设计目标是:
-
基于文本,容易调试
-
单个连接中可以交叉 请求/应答 和服务器事件
-
足够简单,在几小时内可以使用任何一种编程语言编写简单但是完整高效的客户端或者服务器
使用 Go 编写的参考实现就是几个小时就完成了主要的部分,而且可以很快的集成到现有的系统,通过 gockerize 工具
另一个实现使用 Java 编写,现在在 AeroFS 桌面客户端实现。
XMPP 成果
一点也不意外的是,Java 编写的新服务器和之前 Go 编写的服务器一样:
-
更小,代码更容易维护
-
降低内存占用
-
降低磁盘占用
-
降低 CPU 使用
很明显,这些改进并不是因为语言的选择,而是因为更加简单的设计。但是,从 Go 实现的 XMPP 和 Java 实现的 XMPP 来看,Go 的代码相对容易维护,可读性更高。
XMPP 开源
AeroFS 把 SSMP 开源,发布到社区:
— Hugues & the AeroFS Team.
via aerofs.com