10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

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

关注

评论

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

初识java-JDBC,mysql索引左前缀原理

Java 程序员 后端

全网最新最全面Java程序员面试清单(12专题5000解析)

Java 程序员 后端

凡尔赛一波:美团面试就这?,java工程师面试突击第二季分布式

Java 程序员 后端

分布式基石|最难 paxos 和最易 raft?,java排序算法面试题

Java 程序员 后端

初学者这样玩 TypeScript,迟早进大厂系列!

Java 程序员 后端

开源应用中心|Discuz!X全新PC社区体验,多种场景一站解决

Discuz! 开源社区 Discuz

入门级的我在学完阿里大牛写的MySQL笔记后,简历上写了精通

Java 程序员 后端

全网最透彻!Dubbo整合SpringBoot详解,又通宵了

Java 程序员 后端

关于Redis主从节点数据过期一致性的思考,它真的足够一致了吗?

Java 程序员 后端

一个往返于海陆的撸猫打渔人,用影像记录生活的星辰大海

最新动态

全网火爆MySql 开源笔记,图文并茂易上手,阿里P8都说好

Java 程序员 后端

公司来了一位前阿里大神,分享8面阿里面经(Java岗面试题集锦

Java 程序员 后端

分布式事务与Seate框架:分布式事务理论,Java知识总结

Java 程序员 后端

刚从今日头条Java研发岗面试回来,我总结的失败原因(附面试题

Java 程序员 后端

看动画学算法之:双向队列dequeue

程序那些事

数据结构 算法 程序那些事 11月日更 双向队列

先知道怎么手写一个分页查询,再去使用PageHelper吧

Java 程序员 后端

写了四年的Java代码,分布式高并发都不会还做程序员?

Java 程序员 后端

凭借着这份Spring面试题,我拿到了阿里,字节跳动美团的offer

Java 程序员 后端

分布式ID生成策略,我和面试官掰扯了一个小时

Java 程序员 后端

分布式下的数据一致性问题,怎么解决?,java编程教程下载

Java 程序员 后端

初探Linux--鸟哥私房菜读书笔记,廖雪峰java教程百度云

Java 程序员 后端

使用MySQL的NoSQL的七大理由,java基础入门第二版第三章答案

Java 程序员 后端

做了两年P7面试官,谈谈我认为的阿里人才画像,你配吗

Java 程序员 后端

我的应用我做主丨动手搭建招聘小应用

华为云开发者联盟

低代码 招聘 应用 AppCube 应用魔方

农业末流211,Java自学一年的我是怎么走上大厂之路的

Java 程序员 后端

全网讲解最透彻:高性能网络应用框架Netty,仅此一篇

Java 程序员 后端

八、springboot 简单优雅的通过docker-compose 构建

Java 程序员 后端

关于垃圾回收你真的了解透彻了吗?我熬夜深度剖析了一下

Java 程序员 后端

判断对象是否已死分析总结——JVM系列,让人茅塞顿开

Java 程序员 后端

做个小项目那不是简简单单!Java实现航空航班管理系统。

Java 程序员 后端

写博客是一种乐趣,一种需要培养的乐趣,java技术架构SHEET

Java 程序员 后端

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