6

在我的解决方案中,我使用分布式任务来监控硬件实例一段时间(比如 10 分钟)。在以下情况下我必须做一些事情:

  • 我开始这个监控会话
  • 我完成了这个监控会话
  • (可能)在监控会话期间

在整个会话(10 分钟)中运行单个任务并执行所有这些操作是否安全,或者我应该将这些操作拆分为他们自己的任务?

在我看来,单一任务的优势在于更容易管理和实施时序约束。但:

运行一大群(大部分)睡着的工人是个好主意吗?例如,如果我知道我最多会打开 200 个会话,那么我有一个 500 名工人池来确保始终有可用的“会话”席位?

4

1 回答 1

10

对此没有一刀切的答案

  • 将一个大任务 A 分成许多小部分(A¹、A²、A³、...)将增加潜在的并发性。

因此,如果您有 1 个具有 10 个工作线程/进程的工作实例,A 现在可以使用 10 个线程并行运行,而不是在一个线程上按顺序运行。

部分的数量称为任务粒度(细粒度或粗粒度)。

  • 如果任务过于细化,消息传递的开销将拖累性能。

每个部分必须有足够的计算/IO 来抵消将任务消息发送到代理的开销,如果没有工作人员接收它,可能会将其写入磁盘,工作人员接收消息等等(请注意消息传递可以调整开销,例如,您可以有一个临时队列(不将消息持久化到磁盘),并发送在那里不那么重要的任务)。

  • 一个繁忙的集群可能会让所有这些没有意义

如果您有一个繁忙的集群(例如,3 个工作实例,每个实例有 10 个线程/进程,所有正在运行的任务),则可能已经实现了最大并行度。

那么你很多人通过划分任务并没有得到太多好处,但是执行 I/O 的任务比 CPU 密集型任务(按 I/O 操作划分)有更大的改进机会。

  • 长时间运行的任务很好

工人对长时间运行的任务不过敏,无论是 10 分钟还是一个小时。

但这也不理想,因为任何长时间运行的任务都会阻止该插槽完成任何等待任务。为了缓解这种情况,人们使用路由,以便您拥有一个专用队列,并为必须尽快运行的任务配备专门的工作人员。

-

于 2012-09-10T16:14:36.410 回答