asp.net-core - 如何在 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
。
解决方案
我建议不要将控制器直接链接到后台处理器。出于可靠性原因,它们之间应该有一个持久队列。这可以是 Azure 队列、Amazon 简单队列,甚至可以是 MSMQ 或数据库之类的老派。
您的处理器可以是独立的(Azure Function、Amazon Lambda 或类似 Win32 服务的老派),也可以是您的 Web 应用程序的一部分(ASP.NET Core 托管服务)。
您的控制器写入持久队列,然后返回。然后,您的处理器从队列中读取消息并进行处理。您的处理器将使用 TPL Dataflow 或 Rx - 以更自然的为准。
推荐阅读
- python - Selenium 找不到现有元素
- java - base64 编码字符串:可以用 PHP 解码,但不能用 Java 解码?
- javascript - 从数组中创建值的对象都等于 1
- kivy - Kivy - 提取和分组 KV 文件中的常用参数,如 CSS 中的“id”
- node.js - 是什么导致 AWS Lambda 上的 Mongodb 超时错误?
- javascript - 在模式上显示选定的图像
- angular - 使用本地编辑的 npm 包
- angular - 在 Angular 中发送批量电子邮件 UI 设计
- android - Android Wifi 扫描仪未在列表视图中显示结果
- aframe - Aframe弹药物理如何设置弹性或恢复?