同步与异步模式
本文为您介绍阿里云Java SDK的架构模型,您可以根据具体的应用需求选择不同架构,从而设计出高效、可靠Java程序。
阿里云Java SDK提供了同步(Synchronous)和异步(Asynchronous)两种编程模型,它们的主要区别在于执行请求和处理响应的方式,以及对调用线程的影响。
同步与异步对比
模式 | 优点 | 缺点 |
同步 |
|
|
异步 |
|
|
同步模式
在同步模式下,发起请求后,调用线程会一直等待操作完成并返回结果,期间不做其他事情,因此线程被阻塞。适用于对延迟较为敏感且对吞吐量要求不高的场景,因为它保证了操作的顺序性和结果的即时性。您可以引入阿里云Java SDK来实现该模式,Java SDK的获取方式:
访问阿里云门户。
在顶部菜单栏选择云产品,例如选择云服务器ECS。
在所有语言栏目中选择Java。
选择您需要的安装方式,将代码复制到您的项目中。
在您的项目中安装该SDK。
示例代码
import com.aliyun.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.ecs20140526.models.DescribeRegionsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
public class Sample {
public static void main(String[] args) throws Exception {
Config config = new com.aliyun.teaopenapi.models.Config();
// 从环境变量获取RAM用户的AccessKey ID
config.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 从环境变量获取RAM用户的AccessKey SECRET
config.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// 地域ID
config.setRegionId("cn-hangzhou");
com.aliyun.ecs20140526.Client client = new com.aliyun.ecs20140526.Client(config);
// 运行时参数重试设置,仅对使用了该运行时参数实例的请求有效
RuntimeOptions runtimeOptions = new RuntimeOptions();
DescribeRegionsRequest describeRegionsRequest = new DescribeRegionsRequest();
// 同步调用
DescribeRegionsResponse describeRegionsResponse = client.describeRegionsWithOptions(describeRegionsRequest, runtimeOptions);
System.out.println(describeRegionsResponse.getBody());
}
}
异步模式
在异步模式下,请求发出后,调用者线程可以继续执行其他任务,不等待操作完成,操作结果通常通过回调、事件、Future等方式通知调用者。适用于追求高吞吐量和系统响应性的场景,尤其是在处理大量并发请求时,能够有效避免线程被长时间阻塞,提升整体处理效率。您可以引入Java(异步) SDK来实现该模式,Java(异步) SDK的获取方式:
访问阿里云门户。
在顶部菜单栏选择云产品,例如选择云服务器ECS。
在所有语言栏目中选择Java(异步)。
选择您需要的安装方式,将代码复制到您的项目中。
在您的项目中安装该SDK。
示例代码
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.ecs20140526.AsyncClient;
import com.aliyun.sdk.service.ecs20140526.models.DescribeRegionsRequest;
import com.aliyun.sdk.service.ecs20140526.models.DescribeRegionsResponse;
import com.google.gson.Gson;
import darabonba.core.client.ClientOverrideConfiguration;
import java.util.concurrent.CompletableFuture;
public class DescribeRegions {
public static void main(String[] args) throws Exception {
// 使用静态凭证提供者,从环境变量中获取访问凭证
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// 从环境变量获取RAM用户的AccessKey ID和AccessKey Secret
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
.build());
// 构建异步客户端,指定区域和凭证提供者
AsyncClient client = AsyncClient.builder()
.region("cn-hangzhou") // Region ID
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
.setEndpointOverride("ecs.cn-chengdu.aliyuncs.com")
)
.build();
// 创建请求对象,用于查询所有区域
DescribeRegionsRequest describeRegionsRequest = DescribeRegionsRequest.builder()
.build();
// 发起异步请求,并获取响应的未来对象
CompletableFuture<DescribeRegionsResponse> response = client.describeRegions(describeRegionsRequest);
// 获取结果(阻塞调用线程,直到异步调用完成)
DescribeRegionsResponse resp = response.get();
// 打印结果
System.out.println(new Gson().toJson(resp));
// 获取结果(不阻塞调用线程,使得调用线程可以继续执行其他任务,提高了程序的并发性和响应性)
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // Handling exceptions
System.out.println(throwable.getMessage());
return null;
});*/
// 关闭客户端,释放资源
client.close();
}
}