#btree-map #b-tree #map #pub-sub #subscription #pubsub

submap

B-Tree pub/sub服务映射

16个版本

0.3.0 2024年5月26日
0.2.7 2024年3月8日
0.2.5 2023年6月17日
0.2.3 2022年10月6日
0.1.2 2021年12月26日

#197 in 网络编程

Download history 72/week @ 2024-04-22 17/week @ 2024-04-29 44/week @ 2024-05-06 14/week @ 2024-05-13 94/week @ 2024-05-20 149/week @ 2024-05-27 27/week @ 2024-06-03 23/week @ 2024-06-10 23/week @ 2024-06-17 10/week @ 2024-06-24 20/week @ 2024-07-01 91/week @ 2024-07-08 33/week @ 2024-07-15 28/week @ 2024-07-22 36/week @ 2024-07-29 59/week @ 2024-08-05

每月180次下载
用于8个Crates (4直接)

Apache-2.0

52KB
1.5K SLoC

submap

B-Tree pub/sub服务映射。

订阅映射

使用方法

use submap::SubMap;

type Client = String;

let mut smap: SubMap<Client> = SubMap::new();

其中 "Client" 是pub/sub客户端类型,通常是通道或包含通道、锁定套接字或其他与客户端一起工作所需内容的结构。

客户端类型必须提供特质 Ord、Eq 和 Clone。

在它们可以订阅/取消订阅之前,所有客户端都必须在映射中注册。使用 "register_client" 函数进行此操作。

调用 "unregister_client" 时,它也会自动将客户端从所有已订阅的主题中取消订阅。

分隔符和通配符

SubMap支持以下掩码

  • this/is/a/topic - 单个主题订阅
  • this/?/a/topic - 匹配模式的所有主题(第2块 - 任何值)
  • this/is/* - "this/is" 的所有子主题
  • * - 所有主题

服务符号可以更改。例如,让我们创建一个具有MQTT样式通配符(+代表?,#代表*)但以点作为子主题分隔符的订阅映射

use submap::SubMap;

type Client = String;

let mut smap: SubMap<Client> =
    SubMap::new().separator('.').match_any("+").wildcard("#");

注意,"/topic/x"、"topic/x" 和 "topic//x" 是三个不同的主题。如果需要任何类型的规范化,应在调用SubMap函数之前手动完成。

公式

SubMap还支持公式,这些公式用于通过公式订阅主题或获取匹配一个的客户端列表。

公式是非标准pub/sub功能,当客户端想订阅具有例如某些重要性级别的主题时很有用。客户端可以订阅一个具有公式的主题,而不是订阅所有级别主题,而不是订阅所有级别主题。

use submap::SubMap;

type Client = String;

let mut smap: SubMap<Client> =
    SubMap::new().separator('/').match_any("+").wildcard("#").formula_prefix('!');
let client1 = "client1".to_owned();
smap.register_client(&client1);
smap.subscribe("some/!ge(2)/topic", &client1);
assert_eq!(smap.get_subscribers("some/1/topic").len(), 0);
assert_eq!(smap.get_subscribers("some/2/topic").len(), 1);
assert_eq!(smap.get_subscribers("some/3/topic").len(), 1);

更多: mkmf::Formula.

广播映射

use submap::BroadcastMap;

type Client = String;

let mut bmap: BroadcastMap<Client> = BroadcastMap::new();

执行相反的操作 - 客户端使用常规名称注册,而 "get_clients_by_mask" 函数返回与掩码匹配的客户端。

注意:默认分隔符是点。

ACL映射

let mut acl_map = submap::AclMap::new();

基于SubMap的高速访问控制列表检查器。使用单个单元 "client" 的SubMap算法验证各种访问控制列表。

Crates功能

  • indexmap 将引擎切换到 indexmap(默认基于 std::collections::BTreeMap/BTreeSet),需要为映射客户端实现 Hash 特性。

当前引擎可以从以下途径获得

use submap::types::ENGINE;

dbg!(ENGINE); // std-btree or indexmap

Cargo 包

https://crates.io/crates/submap

依赖关系

~0.3–1.8MB
~41K SLoC