如何在 ASP NET Core 中集成 TPL 数据流

How to integrate TPL Dataflow in ASP NET Core

您好,最近对 TPL Dataflow 非常感兴趣,我想将它集成到我的 ASP .NET Core 应用程序中。 我想将它用作一个管道,其中来自应用程序不同部分的多个方法可以 post 将数据发送到此 DataFlow 链。 我不知道的是,如果您希望从多个地方调用它们,您将 link 块存储在哪里?

制作人

public class Producer
{
    private BufferBlock<int> startBlock{get;}
    private ActionBlock<int> ioBlock{get;}
    private IOService service;

    private void InitializeChain()
    {
       this.startBlock=new BufferBlock<int>();
       var transformLink=new TransformBlock<int,string>([something]);
       // some chain of blocks here 
       this.ioBlock=new ActionBlock<int>(async(x)=>await this.service.WriteAsync(x));
       this.startBlock.LinkTo([someBlock]).LinkTo([someOtherBlock])......LinkTo(ioBlock);
    }
    public async Task AddAsync(int data)
    {
        this.BufferBlock.Post(data);
    }
    public Producer(IOService service)
    {
        this.service=service;
        this.InitializeChain();
    }
}

API 制作人
我设想这个 Producer 从我的应用程序的多个部分被调用,为了简洁起见,我们使用 Controller-s:

public class C1:Controller
{
    private Producer producer;
    [HttpPost]
    [Route([someroute])
    public async Task SomeRoute(int data)
    {
        await  this.producer.AddAsync(data);
    }
    [HttpGet]
    [Route([someotherroute])
    public async Task SomeOtherRoute(int data)
    {
        await  this.producer.AddAsync(data);
    }
    public C1(Producer producer)
    {
      this.producer=producer;
    }
}

启动

  public void ConfigureServices(IServiceCollection services) {
           services.AddSingleton<Producer>();
  }

这可以扩展到多个 Controller 场景或层次结构中的更深层次。

现在我的问题是:
保留 Dataflow 链的 Producer 应该如何注入?它应该是短暂的吗? Blocks 是否应该在每次调用时实例化?

不知道这个设计是不是ok.I知道TPL Dataflow是线程安全的,但是可以这么用吗?

P.S 我基本上不知道以什么形式保留我的 Dataflow 管道及其生命周期,如果我希望它按我的 ASP NET Core 应用程序的整个范围。 我想从多个端点(直接或在调用层次结构中更深)获取数据,对它们进行批处理,转换它们,并控制它们最终写入外部源的方式(async 操作)。 这与已经存在的 ThreadPoolASP NET Core 配合得好吗?

P.S 2:这个问题也困扰着我 Rx 等价物。

我建议不要将控制器直接链接到后台处理器。出于可靠性原因,它们之间应该有一个持久队列。这可以是 Azure 队列、Amazon 简单队列,甚至是像 MSMQ 或数据库这样的老派东西。

您的处理器可以是独立的(Azure Function、Amazon Lambda 或像 Win32 服务这样的老派),也可以是您的 Web 应用程序的一部分(ASP.NET 核心托管服务)。

您的控制器写入持久队列,然后 returns。然后您的处理器从队列中读取消息并处理它们。您的处理器将使用 TPL Dataflow 或 Rx - 以更自然的为准。