java - 我应该让我的 REST 客户端 API 库异步(Java 8)

标签 java rest asynchronous java-8 asyncresttemplate

我正在为我们的 REST 服务器创建客户端库。对于 C# 库,我使用 HttpClient.PostAsync()这很好用,它返回一个调用者可以等待的对象(使其同步),他们可以完成一些其他操作然后等待,或者他们可以使用 C# 等待机制。很好的解决方案。

对于 Java,我必须为 Java 8 编写库,因为这是使用最多的版本。 Java 8 覆盖了 98% 的程序员。 (如果我们有足够的需求,我也会做一个 Java 11,然后我们有本地异步调用。)

所以这是我的问题,There are ways to get async behavior ,使用 DeferredResult 或某些第 3 方类。但是我围绕这个构建我的 API 并强制它有什么好处吗?因为如果我创建一个同步 API,调用者仍然可以在他们自己的 DeferredResult 代码中调用它。这是相同的最终结果。

所以在我看来,提供一个简单直接的 API 的方法就是提供一个同步 API。那些想要异步的人将其包装在他们喜欢使其异步的任何机制中。这里的一个重要优势是我不会强制使用他们不使用的机制或第 3 方库。

这种方法有什么缺点吗?

更新:这里有更详细的信息。

如果我只有一个同步 API,那么调用者可以包装我的同步 API in many different ways .最简单的使用 vanilla Java 8 是:

// API is: public Metrics postMetrics(Template template)    
CompletableFuture<Metrics> completableFuture = CompletableFuture.supplyAsync(() -> { return client.postMetrics(template); });

如果我改为创建一个异步 API,那么我会选择这些方法中的哪一个(我会使用 CompletableFuture),因此 API 变为:

// API is: public CompletableFuture<Metrics> postMetrics(Template template)
CompletableFuture<Metrics> completableFuture = client.postMetricsAsync(template);

诚然,使用异步 API 会更容易一些。但差别很小。缺点是我现在对它们强制使用异步方法。我是否错过了提供异步 API 的更大优势?

最佳答案

这不是相同的最终结果。

同步 I/O 会为阻塞的线程消耗大量内存。这是同步方法的主要缺点。以同步 I/O 为主,你的异步 I/O 仍然需要同步 I/O,因此会消耗大量资源。

合理的方法是使异步接口(interface)成为主要接口(interface),并用同步方法对其进行扩充。然后,用户可以选择是否有能力为阻塞的线程花费内存,或者使用最少的资源使用多个 I/O 操作。

关于java - 我应该让我的 REST 客户端 API 库异步(Java 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62105107/

相关文章:

javascript - 套接字服务器无法与 JavaScript 套接字客户端连接

java - 在 Jersey 2.x 中过滤器实现不起作用?

.net - REST API URL 结构建议

javascript - 您可以直接使用 .then 调用异步函数/方法吗?

c# - .NET 4.5 异步等待和重载方法

java - 在具有模块间测试依赖性的 Maven 构建中正确实现 Java 模块

java - 使鼠标按钮触发类事件

java - 获取 JAXBElement 列表,我想要预定义的 java 对象列表

node.js - 如何使用node.js从本地读取图像并将其转换为文件对象

c# - 使用 C# Async Await 进行负载测试