我正在设计一个系统,其中有一个主要的对象流,并且有多个工作者从该对象中产生一些结果。最后,有一些特殊的/唯一的工作者(在图论中有点像"水槽"(,它获取所有结果,并将它们处理到某个最终对象,该对象被写入某个数据库。
一个工人可能依赖于其他工人的结果(因此,等待他们的结果(
现在,我面临几个问题:
- 可能是一个工人比另一个慢得多。你是怎么处理的?增加更多较慢类型的工人?(可能是动态的(
- 假设W_B依赖于W_A。如果W_B由于某种原因停机,则流量将停止,系统将停止工作。所以我希望这个系统能绕过这个工人
- 此外,最终工人如何决定何时对结果集进行操作?假设它有A和B的结果,但没有C的结果。可能是C下降了,或者它现在很慢。它如何才能做出决定
值得一提的是,它不是一个实时应用程序,而是一个离线处理系统(即,您可以访问数据库并更改记录(,但同时,它必须以"高速"处理相对大量的对象。
关于技术,
我正在用Java开发系统,但我不局限于特定的技术。
如果你能帮助我进行系统的总体设计,我将非常高兴。
非常感谢!
如果一个工作进程比另一个慢,可能会创建更多该类型的实例;例如,Kubernetes允许动态创建Node,Kafka允许对主题进行分区,以便多个实例可以读取和处理它
如果B依赖A,而A坏了,B就不能工作了,就这样。也许重新启动A?也许你可以定期对它进行健康检查。
如果最后一个工人需要A、B和C的结果,如果没有C,它将如何处理?如果可以的话,它可以存储A和B的结果,安装一个计时器,如果在C没有到达的情况下发生这种情况,继续。
其他一些想法:
如果你的意思是说整个应用程序的某些子任务比其他子任务执行得更快,那么最好将应用程序分割开来,让每个工作人员都能做一点每件事——换句话说,一份快速的工作,一份慢速的工作。但是,如果你的意思是说有些机器比其他机器慢,那么你可以在慢机器上运行更少的工人,在快机器上运行更多的工人,从而平衡事物,使每个工人拥有大致相同的资源。
您可能希望通过工作者之间的某种持久排队来解耦您的体系结构。
使用带有超时和重新启动的心跳是很常见的。
分布式流处理很快变得非常复杂。如果您在上面构建一个流处理框架,提供高可用性和开箱即用的一次性语义,那么您的生活会轻松得多。