#queue #macro #framework #async #data-structures

rusty_chain

该库封装了称为“链链接”的功能处理单元。链中的每个链接都旨在是独立的、不可变的、幂等的和高度可测试的。

1个不稳定版本

0.1.18 2023年8月6日
0.1.17 2023年8月6日
0.1.15 2023年7月27日

#520并发

Download history 67/week @ 2024-07-27

每月 67 次下载

MIT/Apache

98KB
1.5K SLoC

Rusty Chain

该库封装了表示为链链接的功能处理单元。链中的每个链接都旨在是独立的、幂等的、基本上不可变的和高度可测试的。

特性

  • ChainLink 是一个独立的处理单元,接收输入并发送输出。
    • 使用 chain_link! 宏可以快速构建从输入到输出的映射的内部结构。
  • 链是由 ChainLink(和其他链)的连接组成,是这种处理方法的自然扩展。
    • 使用 chain! 宏可以连接由 chain_link!chain! 创建的 ChainLink
  • chain! 宏允许并行处理多个 ChainLink 实现,每次调用 process 时按轮询迭代它们。
    • 如果一个 ChainLinktry_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!并行条件

    • 这将允许一个ChainLinktry_pop根据每个目标的条件块到达不同的目标ChainLink,从而实现逻辑的异步处理拆分。
  • chain!嵌套集合

    • 想法是这样的:你可以做以下事情:chain!(SomeChain, String => String, [SomeChainLink => [OneSplit, AnotherSplit]: (one join) => FinalChainLink]: (all join))

依赖关系

~3–11MB
~94K SLoC