#pub-sub #websocket #protocols #encryption

app mles

Mles,一个分布式发布/订阅数据服务器

83 个版本 (27 个稳定版)

2.3.0 2024年7月24日
2.2.3 2024年3月7日
2.0.0 2023年12月29日
1.1.7 2023年11月26日
0.5.2 2017年3月25日

#109网络编程

Download history 576/week @ 2024-04-26 54/week @ 2024-05-03 5/week @ 2024-05-17 2/week @ 2024-05-24 1/week @ 2024-06-14 1/week @ 2024-06-21 1/week @ 2024-06-28 18/week @ 2024-07-05 84/week @ 2024-07-19 32/week @ 2024-07-26 4/week @ 2024-08-02

每月120次 下载

MPL-2.0 许可证

37KB
590 代码行

mles-rs 许可证:MPL 2.0

Mles crates.io 状态

Mles (现代轻量级通道服务) 是一种客户端-服务器数据分发协议,旨在作为轻量级且可靠的分布式发布/订阅数据服务。

请访问 https://mles.iohttps://mles.io/blog.html 了解 Mles 的通用概述,以及 /c/mles 了解最新动态。

Mles v2 协议概述

Mles 客户端首先使用 TLS [1] WebSocket [2] 会话中的 Mles 协议头部第一帧值三元组(uid,通道,可选认证)连接到 Mles 服务器。三元组是 JavaScript 对象表示法(JSON)封装的。Mles 客户端首先通过发送正确的 Mles 协议头部第一帧值三元组(uid,通道,可选认证)订阅一个通道,其中 通道 是发布/订阅的通道。如果需要在 WebSocket TLS 上进行身份验证,则可能包含 认证。Mles 客户端必须将 Sec-WebSocket-Protocol 子协议设置为 "mles-websocket" [3],才能成功与 Mles 服务器建立连接。

Mles 服务器验证 Mles 协议头部第一帧,然后将 Mles 客户端加入到所选通道。每个通道都有自己的上下文,与其他通道独立:因此,总是使用每个(uid,通道)对的一个 TLS 会话。加入后,Mles 服务器将值三元组分发到同一通道上的所有客户端。如果 Mles 客户端想离开一个通道,它只需关闭 Websocket TLS 会话。如果 Mles 客户端不想接收任何消息,它只需关闭 WebSocket TLS 会话的接收端。

一个Mles服务器可以联系一个Mles对等服务器。Mles对等服务器将此会话视为另一个Mles客户端会话。这允许Mles服务器以有组织、强大且简单的方式在其他Mles服务器之间共享和分发值三元组数据。

Mles服务器可以保存接收到的数据的历史记录,这些数据可以在新客户端连接到Mles服务器时分发。如果Mles服务器重新启动,Mles对等服务器或Mles客户端都可以为Mles服务器提供历史数据,作为已具有历史记录的通道的重新同步。这允许对通道信息进行分布式数据保护。

Mles客户端和服务器独立于IP版本,不使用IP广播或多播。Mles服务器可以配置为使用IP单播。

Mles协议详情

Mles的第一个协议头帧如下

{
	"uid":"<user identification>",
	"channel":"<selected channel>",
	"auth":"<optional authentication hash>"
}

服务器使用

Usage: mles [OPTIONS] --domains <DOMAINS> --wwwroot <WWWROOT>

Options:
  -d, --domains <DOMAINS>      Domain(s)
  -e, --email <EMAIL>          Contact info
  -c, --cache <CACHE>          Cache directory
  -l, --limit <LIMIT>          History limit [default: 200]
  -f, --filelimit <FILELIMIT>  Open files limit [default: 256]
  -w, --wwwroot <WWWROOT>      Www-root directory for domain(s) (e.g. /path/static where domain example.io goes to static/example.io)
  -s, --staging                Use Let's Encrypt staging environment (see https://letsencrypt.org/docs/staging-environment/)
  -p, --port <PORT>            [default: 443]
  -r, --redirect               Use http redirect for port 80
  -h, --help                   Print help

示例服务器

  • 获取一个具有静态IP+域名的公共互联网服务器
  • 打开防火墙的TLS端口443
  • 确保您的wwwroot目录下有静态网页,例如static/your.domain
  • 以root身份运行Mles服务器(由于端口443),启用Let's Encrypt缓存和调试日志,如下所示

RUST_LOG=debug mles--domains your.domain--cache. --wwwrootstatic

您可以将多个域名列出来,例如 --domains your.domain --domains www.your.domain

示例客户端

使用websocat的一个示例客户端会话如下所示

% websocat wss://mles.io --header "Sec-WebSocket-Protocol: mles-websocket"
{ "uid":"alice", "channel":"example" }
Hello Bob!

基于Mles(WebSocket)协议的现有客户端实现

  • MlesTalk in JavaScript
  • <请在此处添加您的客户端!>

参考资料

  1. 传输层安全(TLS)协议版本1.3,https://tools.ietf.org/html/rfc8446
  2. WebSocket协议,https://tools.ietf.org/html/rfc6455
  3. IANA注册的Mles WebSocket子协议,https://www.iana.org/assignments/websocket

依赖关系

~38–51MB
~1M SLoC