【问题标题】:Designing pipeline system管道系统设计
【发布时间】:2021-07-31 14:12:58
【问题描述】:

背景

我有一套工具\解决方案,可以组合成一个单一的数据处理\操作流。

我的流程中的每个单元都进行计算或执行操作。

示例:Solve equation -> send email

在本例中,Solve equation 单位是一种计算单位。而send email 单位是行动。

我有 100 个不同的单位可以按不同的顺序组合在一起。

问题

为了解决这个问题,我打算为我的应用程序创建一个数据流。每个流都会实现这个接口:

public interface IFlow
{
    public IUnit[] UnitsChain{get;}
    
    public void Start(string input);
}

虽然我的单位会实现这个接口:

public interface IUnit
{
    public string /*output*/ Process(string input);
}

这个设计中的一切听起来都是可行的,但听起来像是我在“发明轮子”,而不是使用允许这些选项的现有解决方案。

寻找更好的解决方案来实现这种自定义管道处理。

谢谢!

【问题讨论】:

标签: c# architecture microservices pipeline system-design


【解决方案1】:

“这个设计中的一切听起来都是可行的,但听起来像是我在“发明轮子”,而不是使用允许这些选项的现有解决方案”

微软自己的DataFlow 基本上提供了这个功能,并提供了非常方便的选项来并行化步骤等。

让我们分解一下:

解方程

这听起来像是TransformBlock 的工作。

您将其设置为使用一种转换方法,该方法将采用(我们称之为)TInput 类型并产生TOutput(方程式结果)。

发送电子邮件

我会把它分成两个块:

  1. TOutput 转换为电子邮件
  2. 发送电子邮件

所以你还有一个Transformblock<TOutput , Email>和一个ActionBlock<Email>

(我在这里使用“电子邮件”作为一种类型。它只是一个占位符。当然,确切的类型取决于使用的电子邮件框架。)

把它们放在一起

然后您通过“链接”TransformBlock<TInput, TOutput> => TransformBlock<TOutput, Email> => ActionBlock<Email> 来构建您的管道。

完成后,您已经建立了一个完整的管道,您可以提交TInputs,框架将处理其余的工作。每个块可以是conveniently configured,例如并行处理多个TInput等。

它还让您决定是要使用同步还是异步(Task/await)API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多