#priority-queue #store #message #msg #forwarded #low #bandwidth

msg-store

一种快速且轻量级的消息存储,旨在在硬件配置较低的设备上作为优先队列使用

16 个版本 (8 个破坏性版本)

0.9.1 2022年2月22日
0.8.0 2021年12月30日
0.4.2 2021年11月19日

#589数据结构

每月下载 29 次
用于 6 crates

MIT 许可证

73KB
1.5K SLoC

msg-store

消息存储速度快且轻量,允许在带宽和磁盘容量有限的情况下按优先级转发消息。

入门

在 Cargo.toml 中

msg_store = "0.1.0"

在 src/main.rs 中

    use msg_store::{ Packet, open };
    
    let mut store = open();
    let uuid = store.add(&Packet::new(1, "my message".to_string())).expect("Could not add msg");

    let my_message = store.get(None, None);
    // or
    let my_message = store.get(None, Some(uuid))
  • 消息将按最高优先级然后是最早状态转发。
  • 消息将按最低优先级然后是最早状态销毁。
  • 只有在存储达到最大字节大小限制后,消息才会被销毁。
  • 整个存储有一个最大字节大小限制选项,每个单独的优先级
  • 组也有。例如,开发者可以将存储的大小限制为 1,000 字节,同时将优先级组 1
  • 限制为仅 500 字节,并让更高优先级不受限制(除了存储的限制之外。)
  • 存储记录基本统计信息,例如计算已插入、删除或销毁的消息数量。
  • 已删除的消息是在开发者使用 del 方法指令后删除的。
  • 已销毁的消息是在插入或存储/组默认更新后自动销毁的,前提是已达到最大字节大小限制。
  • 存储可以包含 4,294,967,295 个优先级。

示例

需要将四条消息转发到远程服务器。第一条消息放在优先级 1,第二条放在优先级 2,第三条消息放在优先级 1,第四条消息再次放在优先级 2,如下面的 Rust 示例和表格所示。

    use msg_store::{
        Packet,
        open
    };
    
    let mut store = open();
    store.add(&Packet::new(1, "msg 1".to_string())).expect("Could not add msg");
    store.add(&Packet::new(2, "msg 2".to_string())).expect("Could not add msg");
    store.add(&Packet::new(1, "msg 3".to_string())).expect("Could not add msg");
    store.add(&Packet::new(2, "msg 4".to_string())).expect("Could not add msg");

    let msg_2 = store.get(None, None);
    
优先级 1 优先级 2
msg 1 msg 2
msg 3 msg 4

当调用 get 时,msg 2 将首先检索,因为它在最高优先级组中,并且也是该组中最旧的消息。第二个检索的消息将是 msg 4。

虽然这可能是默认设置,但它并不强制执行。开发者可以向get方法传递一个优先级来获取该组中的下一个消息,或者也可以传递uuid来获取所需的确切消息。

    use msg_store::{
        Packet,
        open
    };
    
    let mut store = open();
    let msg_1_uuid = store.add(&Packet::new(1, "msg 1".to_string())).expect("Could not add msg");
    let msg_2_uuid = store.add(&Packet::new(2, "msg 2".to_string())).expect("Could not add msg");
    let msg_3_uuid = store.add(&Packet::new(1, "msg 3".to_string())).expect("Could not add msg");
    let msg_4_uuid = store.add(&Packet::new(2, "msg 4".to_string())).expect("Could not add msg");

    let msg_2 = store.get(None, None).expect("Could not get msg");
    let msg_1 = store.get(Some(1), None).expect("Could not get msg");
    let msg_3 = store.get(None, Some(msg_3_uuid)).expect("Could not get msg");
    

另一方面,如果设置了最大字节数限制,第一个将被删除的消息是msg 1,因为它位于最低优先级的组中,并且是那个组中最旧的消息。第二个被删除的消息将是msg 3。

数据库后端

消息存储被设计成数据库无关,理论上可以与任何数据库作为后端一起工作,前提是开发者编写了粘合代码。

此库提供了Keeper特性,必须为任何后端插件实现。

其他插件可以在msg-store github页面找到

依赖项