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]

相关文章
|
1月前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
|
1月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
49 13
|
1月前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模版),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、事件绑定与动态交互等功能,广泛适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业加速数字化转型。
完全开源!国内首个完全开源JAVA企业级低代码平台
|
1月前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
|
2月前
|
JavaScript 安全 Java
谈谈UDP、HTTP、SSL、TLS协议在java中的实际应用
下面我将详细介绍UDP、HTTP、SSL、TLS协议及其工作原理,并提供Java代码示例(由于Deno是一个基于Node.js的运行时,Java代码无法直接在Deno中运行,但可以通过理解Java示例来类比Deno中的实现)。
80 1
|
4月前
|
安全 Java Go
Java&Go泛型对比
总的来说,Java和Go在泛型的实现和使用上各有特点,Java的泛型更注重于类型安全和兼容性,而Go的泛型在保持类型安全的同时,提供了更灵活的类型参数和类型集的概念,同时避免了运行时的性能开销。开发者在使用时可以根据自己的需求和语言特性来选择使用哪种语言的泛型特性。
56 7
|
4月前
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
109 1
|
5月前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
103 10
|
4月前
|
SQL 关系型数据库 MySQL
「Go开源」goose:深入学习数据库版本管理工具
「Go开源」goose:深入学习数据库版本管理工具
「Go开源」goose:深入学习数据库版本管理工具
|
4月前
|
缓存 JavaScript 前端开发
为开源项目 go-gin-api 增加 WebSocket 模块
为开源项目 go-gin-api 增加 WebSocket 模块
50 2