【问题标题】:Invoking an external REST API concurrently via AKKA in Java在 Java 中通过 AKKA 同时调用外部 REST API
【发布时间】:2018-01-31 12:48:26
【问题描述】:

我正在尝试 通过其 API 从 Tesla 服务器获取汽车信息

。我想同时进行。即使用 AKKA 演员并行获取多辆汽车的信息

我的方法:

(1)先获取汽车总数。

(2) 创建与汽车数量相等的actor。

(3) 每个actor内部调用rest API并行获取汽车信息。即每个参与者都将获得包含汽车 ID 的 url。

我的方法做得对吗?

具体来说,在第 3 点中,我使用来自 com.ningAsyncHttpClient 调用了每个参与者内部的 Tesla 服务器。在每个actor内部使用AsyncHttpClient会确保每个actor异步发送请求到服务器而不阻塞其他actor吗?

如有需要,将提供更多信息。我是 AKKA 的初学者。看了很多帖子,但找不到我要找的东西。

【问题讨论】:

    标签: java rest concurrency akka


    【解决方案1】:

    特别是对于第 3 点,只要您在 actor 中使用基于 Future 的 API,actor 就不会阻塞。

    一般来说,如果不知道您为什么选择每辆车使用一个演员,就很难说出更多关于您的方法的信息。

    考虑这个问题:为什么不能简单地创建一个listOfCars: List[String] 的 URL 并使用 Future.traverse(listOfCars)(downloadCarDataForUrl _)

    最后,我不知道AsyncHttpClient 的行为如何,但我会仔细检查一下,如果您有数千辆汽车的列表,AsyncHttpClient 不会同时下载所有汽车......如果是这样的话,您可能会很快被 api 提供程序阻止。如果这成为一个问题,您可以查看 akka-http,它只使用与某个主机的连接数量有限。

    【讨论】:

    • 我为每辆车选择 1 个演员的重点是同时从服务器获取每辆车的数据。但似乎我可以使用基于未来的 API 对单个参与者做同样的事情。您对此有何建议?您认为哪种方法更好?
    • 如果您之后不对演员做任何其他事情,我不建议每次下载使用 1 个演员。因此,如果唯一的目的只是下载,请使用基于未来的变体。现在,再次创建单个actor来处理所有下载不是必需的,但可以使错误处理更容易实现。
    • 我想添加一些关于我正在尝试做的事情的细节.. 不只是下载我正在尝试从服务器实时连续流式传输多辆汽车的数据并不断推送真实的时间数据到亚马逊运动... :)
    • 我尝试按照您的建议使用 AKKA Http,但一直无法找到 scala 方法/类未找到异常...两天都想不通。所以我终于采用了这种方法...
    • 在那种情况下演员已经更合适了。每个actor可以管理一辆汽车的状态,并根据发生的事件采取不同的行动,...
    猜你喜欢
    • 2018-07-28
    • 2021-02-14
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2018-05-24
    • 2012-10-28
    相关资源
    最近更新 更多