2 个不稳定版本

0.2.0 2019年5月1日
0.1.0 2019年3月25日

#22#resp


用于 meilies-client

MIT 许可证

57KB
1.5K SLoC

meilies

MeiliES

基于 Rust、使用 Redis 协议的事件存储

Build Status Dependency Status

meilies-client crate meilies-client documentation

简介

该项目不再维护,请考虑寻找其他工具。

MeiliES 是一个使用 RESP (REdis Serialization Protocol) 进行通信的 事件源数据库。这样可以通过重用现有的协议来创建客户端。例如,可以使用 官方 Redis 命令行界面 程序与 MeiliES 通信。如果您想了解更多,请参阅 发布博客文章

事件存储类似于 Kafka 或 Rabbit MQ,但它将事件永久存储在磁盘上。服务器的第一个目的是将流中的事件发布给所有已订阅的客户端,注意事件按接收顺序保存。客户端还可以指定从哪个事件号(递增)开始读取,因此可以通过读取和重构仅包含新事件的本地状态来恢复。请注意,消息队列不适合事件源

MeiliES demo

特性

  • 事件发布
  • 从可选事件号进行 TCP 流订阅
  • 弹性连接(关闭时重新连接)
  • 基于 Redis 的协议
  • 全 Rust,使用 sled 作为内部存储
  • 编译时间约为 2 分钟

构建 MeiliES

要运行 MeiliES,您需要 Rust,可以通过 https://rustup.rs 上的步骤进行安装。一旦 Rust 在您的 PATH 中,您就可以克隆并构建 MeiliES 二进制文件。

git clone https://github.com/meilisearch/MeiliES.git
cd MeiliES
cargo install --path meilies-server
cargo install --path meilies-cli

基本事件存储使用方法

一旦 MeiliES 安装并可在您的 PATH 中使用,您可以通过执行以下命令运行它。

meilies-server --db-path my-little-db.edb

现在,您的计算机上正在运行一个 MeiliES 服务器,并监听 127.0.0.1:6480。在另一个终端窗口中,您可以指定客户端仅监听新事件。

meilies-cli subscribe 'my-little-stream'

再次在另一个中,您可以发送新事件。所有订阅了同一流的所有客户端都将看到这些事件。

meilies-cli publish 'my-little-stream' 'my-event-name' 'Hello World!'
meilies-cli publish 'my-little-stream' 'my-event-name' 'Hello Cathy!'
meilies-cli publish 'my-little-stream' 'my-event-name' 'Hello Kevin!'
meilies-cli publish 'my-little-stream' 'my-event-name' 'Hello Donut!'

但这并不是事件源的一个真正有趣的用法,对吧?!让我们来看一个更有趣的用法。

真实的事件存储用法

MeiliES按接收顺序存储所有客户端发送的所有流的全部事件。

所以让我们检查一下,并指定我们想要开始读取事件的时刻。一旦流中没有更多事件,服务器将从接收事件的那一刻开始发送事件。

流名称指定

流名称的组成如下。

{名称}{:}{:}

  • 名称:流的名称,区分大小写,不得包含空格(建议使用连字符分隔单词)。
  • 从:指定开始读取的第一个事件编号。可选,如果没有设置,MeiliES将从末尾开始。
  • 到:指定要发送的最后一个事件编号(排除范围)。可选值,如果没有给出,将永远不会停止。

示例

我们可以通过在起始事件编号前加上冒号来做到这一点。

meilies-cli subscribe 'my-little-stream:0'

在这个示例中,我们将从流的第一个事件开始读取。但我们也可以指定从第三个事件开始读取。

meilies-cli subscribe 'my-little-stream:2'

或者从尚不存在的事件开始!尝试向此流发送事件,您将看到:只有第五个事件会出现。

meilies-cli subscribe 'my-little-stream:5'

也可以读取到事件编号为止的流。

meilies-cli subscribe 'my-little-stream:3:5'

当前限制

当前的实现与订阅的流总数有关的一些限制。问题是每个流和每个客户端都会启动一个线程。例如,如果有两个客户端订阅了同一个流,服务器将启动两个线程,每个客户端一个,而不是只启动一个线程并将新事件发送到客户端池。

更糟糕的是,如果客户端关闭连接,启动的线程不会立即停止,而是在某些流活动之后。

支持

对于商业支持,请发送电子邮件至 [email protected]

依赖

~4MB
~58K SLoC