首页 > 解决方案 > 如何在 ASP NET Core 中集成 TPL 数据流

问题描述

您好最近对它产生了浓厚的兴趣TPL Dataflow ,我想将它集成到我的ASP .NET Core应用程序中。我想将它用作管道,来自应用程序不同部分的多个方法可以将数据发布到这个 DataFlow 链。我不知道的是,如果您希望从多个地方调用它们,您将块链接存储在哪里?

制片人

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 Producers
我设想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场景或更深层次。

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

不知道这个设计好不好。我知道 TPL Dataflow 是线程安全的,但是可以这样用吗?

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

PS 2:这个问题也困扰着我Rx

标签: asp.net-coretpl-dataflow

解决方案


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

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

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


推荐阅读