gpt4 book ai didi

Java:如何处理可能需要大约 10 秒的 API 调用

转载 作者:行者123 更新时间:2023-11-29 11:48:02 25 4
gpt4 key购买 nike

我有一个需求,但我对它的设计有点困惑。

要求:iOS 调用后端 (java),后端调用云 API,该 API 返回 token 以供将来调用。云 API 可能需要大约 6 到 10 秒才能返回实际结果,因此它不会等待 6 到 10 秒,而是返回一个 token 并让调用者(在我的例子中是后端 Java 服务器)提取结果。

目前的做法:iOS 调用后端(java 服务器),后端调用云 API 并获取 token ,然后让线程 hibernate 1 秒,一旦线程被调用,它就会访问云端获取状态的 API,如果状态未完成,则再次调用 thread.sleep 并继续调用,直到云 API 调用给出完整的结果。云 API 返回结果后,后端将结果返回到 iOS。

该方法不可扩展,用于测试云 API,但现在我们需要一种更具可扩展性的方法。

这就是我的想法 iOS 调用后端,后端调用 API 并将结果发送回 iOS(它显示一些静态屏幕只是为了让用户参与),同时它将对象放入 Spring 线程池 Executor 中。执行者每隔一秒点击 API 并通过推送通知更新 iOS,这一直持续到我们从云 API 获得最终结果。

这比现有方法更好,但即使这样看起来也不可扩展,并且线程池执行器会在一段时间后耗尽(使其变慢),而且 thread.sleep 也不是一个好的选择。

我考虑过使用 AWS SQS,但它不提供实时处理,而且每 1 秒运行一次后台作业似乎不是一个好的选择。

我也在探索 Apache Kafka 并试图了解它是否适​​合我的用例。

如果有人处理过类似的用例,请告诉我。

最佳答案

在这里@EventListener串联@Scheduled如果使用 Spring 4.2(或更新)版本,则可以使用。

首先创建一个事件对象说 APIResult 它将保存 API 结果

public class APIResult extends ApplicationEvent {   
public APIResult(Object result) {
super(source);
}
}

接下来为发布为 APIResult

的事件注册一个监听器
@Component
public class MyListener {

@EventListener
public void handleResult(APIResult result) {
// do something ...
}
}

接下来创建一个计划进程,该进程将保存尚未检索结果的 token

@Component
public class MyScheduled {

private final ApplicationEventPublisher publisher;

private List<String> tokens = new ArrayList<>();

@Autowired
public MyScheduled (ApplicationEventPublisher publisher) {
this.publisher = publisher;
}

@Scheduled(initialDelay=1000, fixedRate=5000) // modify it as per requirement
public void callAPIForResult() {
// call the API and get result for each token(s) ....
this.publisher.publishEvent(new APIResult(result));
}

// method to add & remove tokens
}

整体流程应该是这样的

  1. 应用程序向 API 提交请求并收集相应的 token 。
  2. 将 token 传递给计划服务以获取结果。
  3. 在其下一次运行中,预定服务迭代可用 token 并调用 API 以获取结果(如果结果可用则发布事件,否则继续)
  4. 发布的事件被注册的监听器拦截;它自己处理结果或在适用时委托(delegate)

这种方法将透明地获取结果,而不会扰乱业务逻辑,同时利用标准框架功能,即。调度和异步事件发布和处理。

虽然我没有对此进行测试,但它应该可以工作,至少给出了如何实现的想法。 该设置已使用 Spring boot 版本进行了测试。 1.5.1.RELEASE 由 Spring 的 4.3.6.RELEASE

支持

如果需要任何进一步的信息,请在评论中告知。

引用 - Spring 中的应用程序事件 ( link )

关于Java:如何处理可能需要大约 10 秒的 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42503159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com