在我的解决方案中,我使用分布式任务来监控硬件实例一段时间(比如 10 分钟)。在以下情况下我必须做一些事情:
- 我开始这个监控会话
- 我完成了这个监控会话
- (可能)在监控会话期间
在整个会话(10 分钟)中运行单个任务并执行所有这些操作是否安全,或者我应该将这些操作拆分为他们自己的任务?
在我看来,单一任务的优势在于更容易管理和实施时序约束。但:
运行一大群(大部分)睡着的工人是个好主意吗?例如,如果我知道我最多会打开 200 个会话,那么我有一个 500 名工人池来确保始终有可用的“会话”席位?
在我的解决方案中,我使用分布式任务来监控硬件实例一段时间(比如 10 分钟)。在以下情况下我必须做一些事情:
在整个会话(10 分钟)中运行单个任务并执行所有这些操作是否安全,或者我应该将这些操作拆分为他们自己的任务?
在我看来,单一任务的优势在于更容易管理和实施时序约束。但:
运行一大群(大部分)睡着的工人是个好主意吗?例如,如果我知道我最多会打开 200 个会话,那么我有一个 500 名工人池来确保始终有可用的“会话”席位?
对此没有一刀切的答案
因此,如果您有 1 个具有 10 个工作线程/进程的工作实例,A 现在可以使用 10 个线程并行运行,而不是在一个线程上按顺序运行。
部分的数量称为任务粒度(细粒度或粗粒度)。
每个部分必须有足够的计算/IO 来抵消将任务消息发送到代理的开销,如果没有工作人员接收它,可能会将其写入磁盘,工作人员接收消息等等(请注意消息传递可以调整开销,例如,您可以有一个临时队列(不将消息持久化到磁盘),并发送在那里不那么重要的任务)。
如果您有一个繁忙的集群(例如,3 个工作实例,每个实例有 10 个线程/进程,所有正在运行的任务),则可能已经实现了最大并行度。
那么你很多人通过划分任务并没有得到太多好处,但是执行 I/O 的任务比 CPU 密集型任务(按 I/O 操作划分)有更大的改进机会。
工人对长时间运行的任务不过敏,无论是 10 分钟还是一个小时。
但这也不理想,因为任何长时间运行的任务都会阻止该插槽完成任何等待任务。为了缓解这种情况,人们使用路由,以便您拥有一个专用队列,并为必须尽快运行的任务配备专门的工作人员。
-