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