【问题标题】:Understanding how Akka provides back pressure了解 Akka 如何提供背压
【发布时间】:2021-01-06 15:02:28
【问题描述】:

因此,我们在生产系统中有一个用例,我们可能会在其中使用 Akka 流。要了解 Akka 流如何准确提供背压,我想更深入地了解我们的需求。

我们有一个 Solr 集群来托管我们的一些数据。接下来,我们有一个 Play 应用程序,它为面向前端客户的网站提供服务。每个传入的请求最终归结为使用 Solr 提供的 /sql 处理程序从 Solr 获取大量数据。一旦我们从 Solr 获取整个数据集,我们在对其进行变形后将其写回 Cassandra 集群。这可以转换为可以使用 Akka 流解决的问题,其中来自 /sql 处理程序的 Solr 流将是 akka Source,而 Cassandra 存储将是 Sink,并且两者之间的所有内容都将是自定义 @987654328 @s.

我正在研究 Akka 流并了解它是响应式流的实现。最值得注意的是,Akka 流的方式提供了背压,以确保客户不会被生产者压倒。现在,关于我的用例,我想了解 Akka 是如何提供背压的。

我可以看到,有一个reactive streams library for Cassandra。由于在我们的例子中它是消费者,这个驱动程序将能够向生产者发出信号,告知它能够接收多少数据。这意味着,生产者端必须有一个相应的驱动程序,可以对该信号做出反应并控制元素的发射。具体来说,由于我们案例中的生产者是 Solr,所以我还必须使用可用于从 Solr 获取文档并将其流式传输到我的应用程序中的响应式兼容 Solr 驱动程序,这不是正确的吗?然后,只要 Cassandra 反应式驱动程序向它发出背压信号,该驱动程序就能够控制它必须从 Solr 集群获取文档的速率。这不正确吗?

如果确实如此,那么在生产者端使用没有非响应式驱动程序的 Akka 流会带来任何好处吗?具体来说,当驱动程序不兼容响应式时,Akka 发布者是否可以通过其他方式提供背压功能?

【问题讨论】:

  • 简而言之,可以通过为 sorl 实现反应式扩展来实现。所有 akka 流逻辑都可以在单个 GraphStage 中定义,请参阅 docs

标签: solr cassandra akka akka-stream reactive


【解决方案1】:

对于 Solr,还有来自 Alpakka 项目的完全反应式 Akka Streams 实现,因此使用它作为 Source 将处理背压,尽管这意味着不使用 SQL 接口来表达查询。

另一方面,由于 Solr SQL 接口本质上是一个使用 Solr 的 JDBC 外观,所以只要定义一个使用 Solr JDBC 驱动程序的 slick.jdbc.JdbcProfile 实例,就可以使用 Alpakka Slick integration

【讨论】:

  • 我知道图书馆。我想问的是,当你在生产者端使用没有响应式驱动程序的 Akka 流时会发生什么。
  • 好吧,如果没有使Source 反应的东西(这基本上意味着基于拉的:Sink 要求数据,上游阶段提供数据或完成流,如果他们不能提供更多)。也就是说,任何可迭代的东西都可以很容易地转换为Source(例如使用Source.fromIterator)。
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2018-11-20
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多