流处理架构

时间:2018-11-22 08:10:38

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

我正在设计一个系统,在该系统中有一个主要的对象流,并且有多个工作程序从该对象中产生一些结果。最后,有一个特殊的/唯一的工作程序(按照图论,是一个“接收器”),它接收所有结果,并将它们处理为最终的对象,然后将其写入数据库。

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

现在,我面临几个问题:

  1. 可能是一个工人比另一个工人慢得多。你怎么处理?增加更多速度较慢的工作程序(=扩展)? (也许是动态的)
  2. 假设W_B依赖于W_A。如果W_B由于某种原因而关闭,则流程将停止并且系统将停止工作。因此,我希望系统以某种方式绕过该工作程序。
  3. 此外,最终工作人员如何决定何时对结果集进行操作?假设它具有A和B的结果,但缺少C的结果。可能是C下降了或者此刻非常慢。如何做出决定?

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

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

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

非常感谢!

2 个答案:

答案 0 :(得分:2)

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

  1. 如果一个工作者比另一个工作者慢,则可以创建更多这种类型的实例。例如Kubernetes允许动态创建Node,而Kafka允许对一个主题进行分区,以便多个实例可以读取和处理该主题。

  2. 如果B依赖于A并且A处于关闭状态,则B无法工作,仅此而已。也许重启A?也许您可以对其进行定期的健康检查。

  3. 如果最终工作人员需要A,B和C的结果,那么在没有C的情况下如何处理?如果可以,它可以存储A和B的结果,安装一个计时器,如果在C尚未到达的情况下熄灭,请继续。

答案 1 :(得分:1)

一些其他想法:

  1. 如果您要说的是整个应用程序中的某些子任务比其他子任务执行得更快,那么最好将应用程序切成片,以便每个工作人员都可以做一些事情-换句话说,快工作的一部分和慢工作的一部分。但是,如果您要说某些计算机的速度比其他计算机慢,那么您可以在速度较慢的计算机上运行较少的工作程序,而在速度较快的计算机上运行更多的工作程序,以平衡事务,以便每个工作程序拥有大致相同的资源。

  2. 您可能希望通过工作人员之间的某种持久排队来使体系结构脱钩。

  3. 在超时和重新启动时使用心跳是很常见的。

分布式流处理很快变得非常复杂。如果您构建在流处理框架之上,那么它的工作将变得更加轻松,该框架提供了高可用性和开箱即用的语义。