写点什么

TPL Dataflow——CCR 的后继

  • 2011-01-09
  • 本文字数:1099 字

    阅读完需:约 4 分钟

TPL Dataflow 是微软面向高并发应用而推出的新程序库。借助于异步消息传递与管道,它可以提供比线程池更好的控制,也比手工线程方式具备更好的性能。代价则是你需要遵循.NET 程序员并不太熟悉的一些设计模式。

一个数据流包含了一系列的“块(block)”。在之前的 CCR 中,每个块叫做一个端口(port),它可以是源数据,也可以是目标数据。通常需要将数据发送给一个传播块以让数据进入到数据流当中,所谓传播块就是实现了 ISourceBlock 与 ITargetBlock 的块。由于传播块也是源,因此它可以链接到其他目标或是传播块上。数据流以异步方式从一个块进入到另一个块当中,根据需要它通常在源或目标处进行缓存。

见名知意,TPL Dataflow 底层的基础设施是.NET 4 的 Task Parallel Library。与 TPL 一样,你可以使用客户化实现替换掉默认的调度器。开箱即用的实现就是.NET 的线程池系统以及使用了异步上下文的框架。如果你希望将数据流运行在特定的线程上时通常会使用后者,比如说使用数据流操纵 GUI 时。文档在这点上描述的并不是十分清楚,但似乎你可以每个块为基础设置调度器。如果真的是这样,那它真的是提供了一种优秀的方式将数据编排到 GUI 线程上了。

默认情况下,数据流已经针对性能进行了调解,实现方式也很棒,这意味着一旦激活了某个块,那么它就会继续处理数据直到运行完毕。为了防止某个块消耗掉所有可用资源,我们可以为其设置一个消息数限定值。如果设置了,那么块只会处理设定的数据量,然后就会终止当前任务并由下一个接管。

块可以使用贪婪或非贪婪的方式使用数据。当多个目标都在争夺同一个源的消息时,后者的价值就彰显出来了。比如说,在使用多个目标对同一源进行负载平衡时,你想要保证这些目标是非贪婪的,以免所有数据都进入到第一个贪婪的块当中。使用非贪婪方式的另一个原因是当消息被新版本替换掉时能够丢弃掉这些消息。Broadcast 块就能说明这个问题。它将每条消息提供给每个目标。如果目标不接受该块,那么在 Broadcast 块接收到下一条消息时它还是可用的。

现在来谈谈锁的问题,为了避免死锁,TPL Dataflow 采用了一个很有趣的设计。当某个块需要接收多个源的输入时,它会等待,直到所有源的数据都可用为止。这样,它将使用两阶段提交来保证确实从每个源获取到了数据。我们强烈推荐开发者使用这种机制,不要手工锁定工作流中的数据。

这种设计可能会导致竞态条件,尤其是与 Broadcast 这样的块联合使用时更是如此。本质上,该问题源自于一条消息被多个块发送并操纵了。既然块会干扰到调度器,那么将不变的数据类型作为消息会更加安全。

目前, TPL Dataflow Library 与 Async CTP 都可以下载了。

查看英文原文: TPL Dataflow – The Successor to CCR

2011-01-09 11:501686
用户头像

发布了 88 篇内容, 共 264.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

字节、阿里等大厂的技术如何?看看这些Java程序员的自学笔记

进击的王小二

程序员 面试

ClickHouse 在UBA系统中的字典编码优化实践

字节跳动数据平台

大数据 字节跳动 Clickhouse 用户行为分析

跨站脚本攻击xss利用-beef攻击-演示

喀拉峻

网络安全 XSS

TiDB 在国信证券海量数据高并发场景中的实践

陈培新

TiDB

构建制品不一致,后续工作都是白费 | 研发效能提升36计

阿里云云效

阿里云 云原生 持续交付 云平台 研发

微信朋友圈高性能复杂度分析

王大胖

国内堡垒机品牌你给推荐哪款?我推荐行云管家!

行云管家

APICloud AVM框架列表组件list-view的使用、flex布局教程

YonBuilder低代码开发平台

前端开发 前端框架 APP开发 APICloud 跨端开发

我的云原生学习方法 | 社区征文

大菠萝

新春征文

Spring Boot Serverless 实战系列 | 性能调优

Serverless Devs

springboot Java web 2月月更

有了堡垒机,运维工程师们不再是背锅侠啦!

行云管家

如何提升本地开发联调效率|阿里巴巴DevOps实践指南

阿里云云效

阿里云 DevOps 云原生 研发 本地开发

react源码解析2.react的设计理念

buchila11

React React Hooks

做到这4点,才是真正的持续交付| 研发效能提升36计

阿里云云效

阿里云 云原生 持续交付 云平台 研发

高性能系统开发的几个手段

漫游指南

性能优化

DDD[1]·区分系统与业务行为

陆乘风

领域驱动设计 领域驱动设计DDD 领域驱动

Web Components系列(三) —— 创建 Custom Elements

编程三昧

前端 组件化 2月月更 WebContents

阿里巴巴移动技术 2021 年终盘点

阿里巴巴终端技术

ios android 客户端 移动应用开发 年终盘点

11亿条数据压缩到12GB,TDengine在陕煤矿山项目的落地实践

TDengine

数据库 大数据 tdengine 开源 物联网

效能时代,数栈专属DevOps跑出加速度

袋鼠云数栈

DevOps 智能运维

恒业资本江一:ToB长期主义不是经营无能的遮羞布

ToB行业头条

云端开发在阿里的典型应用场景 | 阿里巴巴DevOps实践指南

阿里云云效

阿里云 云原生 云平台 研发工具 云端开发

Swagger通过拦截器(Interceptor)配置默认请求头

为自己带盐

swagger 2月月更

C#中的数据字典Dictionary

Andy阿辉

C# 程序员 程序人生 2月日更

无障碍读屏出错了

admin

小程序 性能优化 瀑布流 relations 无障碍

Hive往表写入数据的八种方法

编程江湖

15倍提升 & 40倍存储优化,TDengine在领益智造的实践

TDengine

数据库 大数据 tdengine 开源 物联网

恒源云(GPUSHARE)_可构建AI的「AI」诞生?

恒源云

神经网络 深度学习

使用craco对cra项目进行构建优化

CRMEB

SAP 移动开发技术综述 | 社区征文

汪子熙

android 移动开发 cordova 新春征文 2月月更

网络安全kali渗透学习 web渗透入门 Google搜索引擎的使用技巧

学神来啦

TPL Dataflow——CCR的后继_.NET_Jonathan Allen_InfoQ精选文章