【问题标题】:Does Apache Flink support using HTTP requests as input and output?Apache Flink 是否支持使用 HTTP 请求作为输入和输出?
【发布时间】:2020-06-17 22:57:33
【问题描述】:

作为一个玩具示例,假设我想要构建一个 Web 应用程序,它接收带有 ID 和 $ 金额的 HTTP 请求,并返回一个响应,其中包含 ID 在 24 小时窗口内支付的总金额 $ 金额。如果输入和输出是 Kafka 流,则使用 Apache Flink 当然可以创建该应用程序。

但是是否支持/可以创建一个 Flink 应用,其中输入是 HTTP 请求,输出是对 HTTP 请求的响应?

如果 Flink 不支持,是否有其他数据流框架支持?

(对于上面的玩具示例,我想有比使用 Flink 更简单的解决方案,但我真正的用例是许多、多个窗口和其他通过 HTTP“流”请求的有状态计算。 )

【问题讨论】:

  • 您能否详细说明您为什么要使用这样的设置?我的意思是如果有多个窗口并且计算需要更长的时间,那么请求似乎必须等待很长时间。
  • 所以我想要的是一个 HTTP 请求可以访问的服务,它基本上完成了 Flink 做得好的所有事情:有状态计算和窗口计算。当然,这可以从头开始实现,但是当我阅读 Flink 文档时,对我想要开箱即用的操作类型有很多支持。
  • 是的,但恕我直言,将其作为单个同步请求执行是否真的是一个好主意仍然值得怀疑。在这种情况下,有很多事情需要考虑,例如超时。从您的描述看来,服务器上需要执行大量操作,因此异步执行此操作可能会很好。最后,Flink 提供了诸如窗口之类的功能,但例如 Akka Streams 也是如此。老实说,如果您不是真的在进行大规模计算,我可能会寻找其他一些框架。

标签: apache-flink


【解决方案1】:

Flink 不提供官方的 HTTP 源或接收器,但您可以基于 Sink 和 Source 基类实现自己的。但是我认为这不是“正确”的方法,Flink 并非旨在接收 HTTP 请求并直接回答它们,Flink 通常使用某种持久数据源/接收器,因此如果应用程序失败,它可以重新创建/重新计算状态.

我建议你使用类似 Kafka Bridge:https://strimzi.io/blog/2019/07/19/http-bridge-intro/ 的东西,它允许 HTTP 客户端使用简单的请求写入和使用来自 Kafka 主题的消息。在这种情况下,您将让客户将金额和 ID 数据发布到一个主题,然后 Flink 将使用该主题作为输入并将结果输出到第二个主题。最后,您的客户可以发出第二个请求来轮询结果:

client -> KafkaBridge -> InputTopic -> Flink -> ResultsTopic

客户端 -> KafkaBridge -> 结果主题

【讨论】:

    【解决方案2】:

    Flink 本身没有 HTTP 源或接收器,但 Apache Bahir 中有一个基于 Netty 的源,这正是你想要的。您可以找到有关 bahir-netty here 的更多信息。但据我所知,没有 Sink 可以将数据作为 HTTP 请求发送,因此您可能需要自己实现。

    【讨论】:

    • 所以,我想,只有一个 HTTP 源和一个 HTTP 接收器是不够的。我需要回答传入的 HTTP 请求,而不仅仅是在另一个请求中进一步发送结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2019-06-17
    • 2014-05-13
    • 2020-08-29
    相关资源
    最近更新 更多