写点什么

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:502048
用户头像

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

关注

评论

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

web 性能压测工具

Z冰红茶

为啥Underlay才是容器网络的最佳落地选择

BoCloud博云

云计算 容器

API网关——Kong实践分享

BoCloud博云

云计算 容器 PaaS API

挑战10的1,143,913次方种算法组合:这都不是事儿!

华为云开发者联盟

华为 算法 进化 华为云

架构感悟 7- 性能优化何为

旭东(Frank)

数字货币并不能完美诠释区块链金融

CECBC

区块链技术 社会价值 打通数据孤岛 重建产业信用

超详细讲解网络中的数据链路层~

程序员的时光

创新监管首批8个试点应用公示 其中7个涉及区块链

CECBC

漫画:如何证明sleep不释放锁,而wait释放锁?

王磊

Java Wait Sleep

BIGO海量小文件存储实践

InfoQ_3597a20b53cc

【数据结构】Java 常用集合类 HashMap(JDK 1.8)

Alex🐒

Java 源码 数据结构

Kubernetes的拐点助推器:左手开源,右手边缘计算

华为云开发者联盟

Kubernetes 容器 边缘计算 华为云

随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

chenzt

PV与UV你的网站也可以

北漂码农有话说

原生Ingress灰度发布能力不够?我们是这么干的

BoCloud博云

云计算 容器 云原生 PaaS

进击的 Flink:网易云音乐实时数仓建设实践

Apache Flink

flink

创业使人成长系列 (4)- 常用账号申请

石云升

支付宝 微信商户 商标

Java如何调用Python(一)

wjchenge

web压力性能测试

周冬辉

压力测试

关于数据库索引的知识点,你所需要了解的都在这儿了

鄙人薛某

MySQL 索引结构 索引 MySQL优化

【数据结构】Java 常用集合类 ConcurrentHashMap(JDK 1.8)

Alex🐒

Java 源码 数据结构 并发编程

程序设计理念-CentOs7实践Nginx-带来安装服务的通用法则

图南日晟

nginx 架构设计 环境安装

百度大脑OCR技术助力钢铁物流实现智能管理

百度大脑

人工智能 百度大脑 文字识别

Java如何调用Python(二)

wjchenge

BSN北京市区块链主干网正式发布

CECBC

Self-Compassion,对自己好一点

霍太稳@极客邦科技

创业 个人成长 自我管理 创业心态

Netty-物联网设备Channel管理

凸出

Java Netty ConcurrentHashMap 物联网 channel

为什么我们要自主开发一个稳定可靠的容器网络

BoCloud博云

云计算 容器 PaaS fabric

Django Models随机获取指定数量数据方法

BigYoung

django 数据 random 随机 Models

前浪出新招,996已过时,互联网员工都开始住公司了!(爆公司信息)

程序员生活志

加班 996 007 互联网公司

第7周总结:性能

慵秋

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