Spring boot 用于API调用的Spark流式体系结构

Spring boot 用于API调用的Spark流式体系结构,spring-boot,architecture,spark-streaming,Spring Boot,Architecture,Spark Streaming,这更像是一篇关于如何在火花流中正确做事的调查文章。我有一个Spark流媒体应用程序,可以接收卡夫卡流。在Kafka流中,对于我们收到的每一条消息,我都会调用2个API,它们将命中运行在Postgres数据库之上的Spring引导服务器 问题是,我们每天收到超过100万条消息,这些消息目前至少击中我们的API服务器200万次。规模还在扩大。我们还计划再增加2个呼叫,这样对服务器的呼叫量基本上翻了一番。我需要访问API服务器的原因是我们应用于每条消息的规则随着时间的推移而改变。我想到的唯一一件事是获

这更像是一篇关于如何在火花流中正确做事的调查文章。我有一个Spark流媒体应用程序,可以接收卡夫卡流。在Kafka流中,对于我们收到的每一条消息,我都会调用2个API,它们将命中运行在Postgres数据库之上的Spring引导服务器

问题是,我们每天收到超过100万条消息,这些消息目前至少击中我们的API服务器200万次。规模还在扩大。我们还计划再增加2个呼叫,这样对服务器的呼叫量基本上翻了一番。我需要访问API服务器的原因是我们应用于每条消息的规则随着时间的推移而改变。我想到的唯一一件事是获取API调用后面的表,并将其放入流应用程序将调用的变量中。然后,我将设置另一个代理,该代理将轮询Postgres的表更改,并让它更新流作业将调用的变量


唯一的问题是,使用类似广播变量的东西,您只能通过重新启动spark streaming应用程序进行刷新。有人知道我可以在API服务器/Spark流媒体应用程序之间放置什么框架或工具,让我们在不担心DDOS攻击的情况下成长吗?

我想在我的脑海中,有3种选择:

  • 使用缓存代理,但实际上是将问题从数据库转移到缓存。缓存失效问题也随之而来。但是,如果您已经知道所期望的查询并缓存了具体化的值,那么它会有所帮助。这样可以避免多次调用缓存服务器

  • 将数据库日志作为卡夫卡主题提供。现在,您可以在spark流媒体应用程序中加入这两条流。这样,数据库记录中的更改将直接发送到spark应用程序。看看这是否有帮助-最初由Martin Kleppmann编写:

  • 使用像Alluxio这样的堆外内存(spark与之很好地集成)。但是设置相当复杂,因为内存网格必须跨越执行器节点。我不太确定这个解决方案的可行性,但您可以对此进行调查