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 作业来重启一次。

SSMP 产生

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 桌面客户端实现。

SSMP 成果

一点也不意外的是,Java 编写的新服务器和之前 Go 编写的服务器一样:

更小,代码更容易维护

降低内存占用

降低磁盘占用

降低 CPU 使用

很明显,这些改进并不是因为语言的选择,而是因为更加简单的设计。但是,从 Go 实现的 SSMP 和 Java 实现的 SSMP 来看,Go 的代码相对容易维护,可读性更高。

SSMP 开源

AeroFS 把 SSMP 开源,发布到社区:

协议规范

lipwig,使用 Go 实现的手册

基于 Netty 的另一种 Java 实现

Go 编写的服务器加载测试工具

— Hugues & the AeroFS Team.

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-10-23 14:11:53

AeroFS 开源 SSMP 协议,包含 Java 和 Go 实现的相关文章

开源工具高效分析Java应用

开源工具高效分析Java应用 不止一次,我们都萌发过想对运行中程序的底层状况一探究竟的念头.产生这种需求的原因可能是运行缓慢的服务.Java虚拟机(JVM)崩溃.挂起.死锁.频繁的JVM暂停.突然或持续的高CPU使用率.甚至于可怕的内存溢出(OOME).好消息是现在已有许多工具能帮你得到Java虚拟机运行过程中的不同参数,这些信息有助于你了解其内部状况,从而诊断上述的各种情况. 在这篇文章中,我将介绍一些优秀的开源工具.其中一些是JVM自带的,另一些则是第三方工具.我将从最简单的工具开始介绍,逐

Monkey 服务器项目开源授权协议更改

Monkey HTTP Server 和 Duda I/O 宣布把开源授权协议从 LGPLv2.1 转移到 Apache2 .Monkey HTTP Server 和 Duda I/O 刚发布源代码开源时使用的是 GNU Lesser General Public License v2.1 ,但是经过几个月的考虑,并且结合了各种选项的评估和社区成员的一些反馈,发现 Apache License v2.0 才是最好的选择! 究其具体的原因,主要是从个人和企业的一些评估中发现 GPL 协议对商业化并

Nest开源Thread协议

Nest在GitHub上发布了其Thread协议的源代码. 早在2005年,Microsoft和Intel就已经向Internet Society提交了一份文件草案,提出通过低速无线个域网标准(6LoWPAN)的网络传输IPv6包的标准.通过IEEE 802.15.4网络传输IPv6包,后来被称为RFC 4944的文件,是IETF发布为建议标准类型的标准.十一年过去了,Nest Labs开源了 OpenThread,这是基于其Thread协议实现的,通过6LoWPAN标准连接的智能家居网络. 自

微信端口及协议分析(java、C版)_javascript技巧

有朋友公司需求如下,手机通过WIFI连接上网,而老板要求,员工使用手机只能上微信,而不能上其他网页和看在线视频.上网搜索了微信使用协议和端口. 微信通过TCP方式来进行通讯. TCP通讯方式分析 通讯端口分析 远程通讯端口范围: 80,443,80,443,8080. HTTP方式分析 在特征分析中,发现微信会采用HTTP协议进行通讯. 连接的主机(Host)(正则表达式)为:^short\.weixin\.qq\.com,^(mmsns|mmbiz)\.qpic\.cn. TLS方式分析 在特

一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 首先借用有心人士的一张相当直观清晰的图来划分各种协议:开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但"为所欲为"的前提当你发布使用了BSD协议的代码,或则以BS

基于OAuth安全协议的Java应用编程

OAuth 协议致力于使网站和应用程序(统称为消费方 Consumer)能够在无须用户透露其认证信息的情况下,通过 API 访问该用户在服务提供方(Service Provider)那里的受保护资源.更一般地说,OAuth 为 API 认证提供了一个可自由实现且通用的方法.目前互联网很多服务如 Open API 等都提供了 OAuth 认证服务,OAuth 标准也逐渐成为开放资源授权的标准.本文讨论如何使用 Google Code 上提供的 OAuth Java 库来实现基于 OAuth 认证的

java常见的开源算法支持以及java默认支持的provider

java6支持了很多的加密算法,各大机构提供了很多的实现.但是大部分收费. 1.这里Bouncy Castle(http://www.bouncycastle.org)提供了一系列的算法实现,可以跻身于JCE的框架下,以提供者的方式纳入java安全实现的开源项目. 2.commons codec这个apache的项目对java6的api做了易用性改进,但是没有对java6提供扩展加密算法. 这里我们可以看到jdkhome下的jre/lib/security/java.security默认的支持的

协议-用java可不可以实现测量不同负载(轻或者重)下,以太网上数据包的碰撞概率,容易吗?

问题描述 用java可不可以实现测量不同负载(轻或者重)下,以太网上数据包的碰撞概率,容易吗? 学习了csma/cd协议,想要用程序实现一下测量以太网上数据包碰撞的概率,不知道用java行不行,具体得从何做起

Google 微软达成专利和解,协议包含 Android

微软和 Google 发表联合声明,宣布和解所有专利诉讼案, 撤回包括摩托罗拉移动在内的相关专利诉讼请求,同意在特定专利问题上展开合作,并期待在其它领域进行合作.两家公司没有披露和解协议中的财务条款.和解协议包含了 Android.视频和网络相关专利,目前不清楚微软是否放弃了 Android 专利或者是 Google 为微软持有的 Android 专利支付一笔费用.微软每年获得的 Android 专利授权费据信高达34亿美元. 文章转载自 开源中国社区[https://www.oschina.n