多个短命的TPL数据流与单个长时间运行的流程

5

我正在使用TPL数据流技术处理Azure worker角色中的队列项。我应该拥有一个单独的长时间运行的数据流,还是为每个接收到的消息生成新的数据流?

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

我需要能够承受来自无效队列输入等异常而不锁定我的数据流。我看到有两个选择:

  1. 启动单个数据流并在每个消息从队列中出来时发送消息到它。每个块的内容都包裹在try-catch块中,记录异常并继续处理。这似乎很笨拙,我认为有更好的方法。
  2. 对于每个消息,我启动一个新的数据流并处理队列消息。如果任何块中抛出异常,数据流将完成,并且我只恢复单个消息。我看到的大多数Dataflow示例都会发送多个消息,因此这也不太对。

我已经看到了许多关于如何在异常后完成数据流的文档,但关于如何从异常中恢复的文档却很少。


1
你是否曾经在应用程序的整个生命周期中遇到过内存泄漏的问题? - Jonny
看看Stephen Cleary的极简主义Try库。它允许通过管道的所有块传递消息,然后在最后观察到发生的任何异常。这里是对该库的一个小扩展,它允许同时传递原始消息和最终结果/异常。 - Theodor Zoulias
1个回答

2
你应该选择第一种选项,只有一个流程。
在第二个选项中,使用数据流与仅依次调用多个方法相比没有任何附加值。还需要为每个项目创建完整的数据流流程的开销。
最好一次构建流程,并在整个应用程序的生命周期内使用它。我认为按块处理异常没有问题,但如果你想让整个流程失败,然后才创建新的流程,也可以这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接