1个不稳定版本
0.1.18 | 2023年8月6日 |
---|---|
0.1.17 |
|
0.1.15 |
|
#520 在 并发
每月 67 次下载
98KB
1.5K SLoC
Rusty Chain
该库封装了表示为链链接的功能处理单元。链中的每个链接都旨在是独立的、幂等的、基本上不可变的和高度可测试的。
特性
ChainLink
是一个独立的处理单元,接收输入并发送输出。- 使用
chain_link!
宏可以快速构建从输入到输出的映射的内部结构。
- 使用
- 链是由
ChainLink
(和其他链)的连接组成,是这种处理方法的自然扩展。- 使用
chain!
宏可以连接由chain_link!
或chain!
创建的ChainLink
。
- 使用
chain!
宏允许并行处理多个ChainLink
实现,每次调用process
时按轮询迭代它们。- 如果一个
ChainLink
的try_pop
返回None
,它将尝试下一个,等等。
- 如果一个
用法
您需要确定您项目中最小的处理单元是什么,以便您可以开始创建 ChainLink
。通过创建严格的单元测试来捍卫您的 ChainLink
的质量。创建几个 ChainLink
后,使用 chain!
将它们全部组合起来。
每种处理单元(由 chain_link!
宏创建)接受一个可选的初始化器,允许依赖注入。现在,可以在链的 ChainLink
之间共享依赖,但如果没有单元测试来包围使用 chain!
宏构建的 ChainLink
,则强烈反对这样做。
示例
映射器
此示例演示了如何存在一个 ChainLink
来从数据库中提取记录并将它们映射到模型。设计ID的推送比从 ChainLink
中弹出要快,以展示系统如何异步行为,同时从数据库中提取数据,同时接受新的ID。
ETL
本例演示了如何将文件加载的ETL过程分离成三个ChainLink
,将它们全部连接在一起形成一个Chain
,允许您传入文件路径,并在处理完当前行后返回是否成功。本例还涵盖了nom
crate的基本用法以及如何将初始化器用作可变缓冲区。
ETL拆分
本例与ETL示例完全相同,但它还演示了使用chain!
宏的并行功能将最终输出拆分到两个数据库中。
Madlib
本例演示了早期的ChainLink
可能接收一个需要逐个解析的输入组,在后续的ChainLink
中。换句话说,上游的聚合可以与下游合并。
机器人技术
本例演示了在可能希望一个异步过程与另一个异步过程同时运行,但它们不需要等待对方完成输入才被一般处理的情况下使用chain!
宏。在这里,我们希望控制器能够快速关闭机器人,而摄像头传感器可能需要一段时间才能提供数据。
斐波那契数列
本例演示了如何利用迭代过程,特别是在数学运算方面。
工作订单
本例演示了一个简单的订单/工作管理系统,其中客户订单和工作人员可用性在提供时配对。在真正的工 作管理系统中,缓存将存在于数据库中。
灵感
我总是希望编写高度可测试的代码,并在一个逻辑上绝对可靠的环境中工作。
未来工作
-
chain!并行条件
- 这将允许一个
ChainLink
的try_pop
根据每个目标的条件块到达不同的目标ChainLink
,从而实现逻辑的异步处理拆分。
- 这将允许一个
-
chain!嵌套集合
- 想法是这样的:你可以做以下事情:chain!(SomeChain, String => String, [SomeChainLink => [OneSplit, AnotherSplit]: (one join) => FinalChainLink]: (all join))
依赖关系
~3–11MB
~94K SLoC