【问题标题】:Stream processing architecture流处理架构
【发布时间】:2019-04-24 20:52:20
【问题描述】:

我正在设计一个系统,其中有一个主要的对象流,并且有多个工作人员从该对象产生一些结果。最后,有一些特殊/独特的工作人员(就图论而言,有点像“接收器”),它获取所有结果,并将它们处理为写入某个数据库的最终对象。

一个工人可能依赖于其他一些工人的结果(因此,等待他们的结果)

现在,我面临几个问题:

  1. 可能是一名工作人员比另一名工作人员慢得多。你怎么处理?添加更多较慢类型的工人(=缩放)? (可能是动态的)
  2. 假设 W_B 依赖于 W_A。如果 W_B 由于某种原因关闭,则流程将停止,系统将停止工作。所以我希望系统以某种方式绕过这个工人。
  3. 此外,最终工作人员如何决定何时对结果集进行操作?假设它有 A 和 B 的结果,但缺少 C 的结果。可能是 C 已关闭或目前非常慢。它如何做出决定?

值得一提的是,它不是一个实时应用程序,而是一个离线处理系统(即您可以访问数据库并更改记录),但同时它必须处理一个相对大量的对象。 “快节奏”。

关于技术,
我正在使用 Java 开发系统,但不受特定技术的限制。

如果您能帮助我进行系统的总体设计,我会很高兴。

非常感谢!

【问题讨论】:

  • 您需要做什么取决于您的用例。您要么需要某些组件,要么不需要。很少有“很高兴拥有”的组件。在某些时候,拥有少于您的全套流程有什么好处?
  • 您可能有一个非常具体(可能是公司机密)的问题,并且您将其概括性地写下来。但是,作为局外人,我们无法从这些笼统的术语中完全理解您的问题,因为它太模棱两可了(这对您来说并不明显,因为您深陷其中)。也许将其转化为我们可以解决的具体问题?

标签: java bigdata system-design stream-processing event-stream-processing


【解决方案1】:

一些额外的想法:

    1234563换句话说,一份快的工作和一份慢的工作。但如果你的意思是说有些机器比其他机器慢,那么你可以在慢机器上运行更少的工人,而在更快的机器上运行更多的工人,以平衡事情,让每个工人拥有大致相同的资源。
  1. 您可能希望通过工作人员之间的某种持久排队来解耦架构。

  2. 通常使用带有超时和重启的心跳。

分布式流处理很快变得非常复杂。如果您在顶部构建一个提供高可用性和开箱即用的一次性语义的流处理框架,您的生活将会轻松得多。

【讨论】:

    【解决方案2】:

    正如彼得所说,这实际上取决于用例。一些一般性的评论:

    1. 如果一个worker比另一个慢,可能会创建更多该类型的实例;例如,Kubernetes 允许动态创建节点,而 Kafka 允许对主题进行分区,以便多个实例可以读取和处理它。

    2. 如果 B 依赖于 A 而 A 宕机,B 就无法工作,仅此而已。也许重新启动A?也许您可以对其进行定期健康检查。

    3. 如果最终的 worker 需要 A、B 和 C 的结果,如果 C 不可用,它将如何处理?如果可以,它可以存储 A 和 B 的结果,安装一个计时器,如果在 C 没有到达的情况下就停止了,继续。

    【讨论】:

    • 感谢您的评论。您能否详细说明如何根据绩效(= 处理率)动态维护工人(某种类型)的数量
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2018-01-06
    相关资源
    最近更新 更多