【问题标题】:Architecture of distributed tasks execution with priorities具有优先级的分布式任务执行架构
【发布时间】:2015-10-09 12:24:34
【问题描述】:

我们正在研究创建一个用于任务执行的分布式系统,其中任务在 .NET (C#) 中具有优先级。有很多选择,我想听听你的看法。选项及其缺点是:

1) Amazon 的 SWF(简单工作流程) - 在 .NET 中,我们不能使用诸如 java 的 FLOW 之类的框架来简化。这意味着大量的样板代码。此外,亚马逊的这个产品似乎不是很受欢迎(所以:没有社区支持,最终可能会消失)

2) 在排队系统之上构建我们自己的

2.a) SQS - 不是真正的 FIFO,使用 2 个队列(普通和高优先级)不会让我们对优先级进行精细控制(我们也许可以忍受) )

2.b) RabbitMQ - 管理开销(设置、在集群模式下配置以提高可靠性等)

3) 我收到了另一个建议,即在没有队列的情况下使用“事件驱动”。我看不出这怎么可能,也许有人可以帮我澄清一下? (哦,还有,它是否与称为 Akka(基于 actor)的技术有关)

谢谢

【问题讨论】:

  • 我将 SWF 与 .Net 一起使用了大约两年,我不后悔这个决定。 Flow 框架很好,我很羡慕它的一些功能,但 C# 也有它的优势。 SWF 的核心非常简单。我已经为我需要的东西实现了简单的包装器,并且发现它非常灵活。例如,我在短短两个小时内实现了对失败的活动任务的重试。它还与 CloudWatch 很好地集成。
  • 就所需工作量而言,SQS 可能是最便宜的选择。从 Q 中并不清楚使用模式将是什么,但如果它只是排队工作并按优先级顺序执行,那么使用多个 SQS 队列并按优先级顺序遍历它们完全有意义。 (您可以根据需要使其粒度化)

标签: rabbitmq akka distributed-computing amazon-sqs amazon-swf


【解决方案1】:

SQS 可能是最简单的——只需要很少的代码,成本极低,设置时间最短。

如果 2 个队列和高/低优先级不够,则创建 3 个队列、5 个队列或 10 个队列 - 您可以根据需要进行细化。

您可以让多台工作机器按优先级顺序扫描所有队列,或者让一些机器专门用于处理高优先级队列,如果您想更快地处理,这些机器可以更大/更快。

另一种选择是采用单独的自动扩展策略,这些策略将基于高优先级队列长度的小幅增加启动更多/更快的机器,但仅在低优先级队列时扩展更小/更便宜的机器队列变得很长....有很多选项可供选择并微调您的解决方案。

【讨论】:

  • 感谢您的意见。在研究了所有解决方案之后,一个我不知道它的存在的想法出现了:服务总线。 (使用 NServiceBus 或 MassTransit)。然后使用 Sagas 进行协调。你觉得这个主意怎么样?
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多