多个短期 TPL 数据流与单个长期运行流

Posted

技术标签:

【中文标题】多个短期 TPL 数据流与单个长期运行流【英文标题】:Multiple Short-lived TPL Dataflows versus Single Long-Running Flow 【发布时间】:2014-07-20 15:04:30 【问题描述】:

我正在使用 TPL 数据流在 Azure 辅助角色中处理队列外的项目。我应该有一个长时间运行的数据流,还是为我收到的每条消息生成一个新流?

如果在块中抛出错误,该块将停止接受新消息。这意味着如果块中出现异常,整个数据流将停止处理。

我需要能够在不锁定数据流的情况下承受来自无效队列输入之类的异常。我看到以下两个选项之一:

    我启动了一个数据流,并在消息离开队列时向其发送消息。每个块的内容都包装在一个记录异常的 try-catch 块中,然后继续处理。这似乎很笨拙,我认为有更好的方法。 对于每条消息,我都会启动一个新的数据流并处理队列消息。如果在任何块中抛出异常,数据流将完成,我只恢复一条消息。我见过的大多数 Dataflow 示例都发送多条消息,所以这也感觉不对。

我看过很多关于如何在异常后完成数据流的文档,但很少有关于如何从异常中恢复的文档。

【问题讨论】:

您是否遇到过在应用程序的整个生命周期运行一个流的内存泄漏? 看看 Stephen Cleary 的简约 Try 库。它允许通过管道的所有块传递消息,然后观察该消息最后发生的任何异常。 Here 是这个库的一个小扩展,它还允许传递原始消息以及最终结果/异常。 【参考方案1】:

您绝对应该选择第一个选项并且只有一个流程。

在第二个选项中,使用数据流并没有任何附加价值,而只是一个接一个地调用多个方法。为每个项目创建完整的数据流也会产生开销。

最好只构建一次流程,然后在应用的整个生命周期中使用它。我不认为处理每个块的异常有什么问题,但是如果你想让整个流程失败,然后再创建一个新流程。

【讨论】:

以上是关于多个短期 TPL 数据流与单个长期运行流的主要内容,如果未能解决你的问题,请参考以下文章

实体框架长期数据上下文与短期数据上下文 [关闭]

TPL 数据流 - 与事件流一起使用

TPL 数据流在运行时中断 LinkTo()

TPL 可以在多个线程上运行任务吗?

用 TPL 数据流中的最新值替换缓冲值

[读论文]短期投资者,长期投资者,以及公司估值