在调用大模型服务时,高并发场景下可能会出现请求超时、资源消耗大等问题。为解决这些问题,您可以调整连接池配置,优化连接复用情况。
连接池
在高并发场景下,频繁地创建和销毁网络连接会导致显著的性能开销。为了解决此问题,DashScope Java SDK 默认启用了连接池机制,通过复用已有的连接来减少资源消耗,提高请求处理效率。
建议您根据具体业务合理调整连接池的连接数和超时时间,优化连接复用情况。相关配置参数及说明如下:
参数 | 含义 | 默认值 | 单位 | 备注 |
参数 | 含义 | 默认值 | 单位 | 备注 |
connectTimeout | 建立连接的超时时间。 | 120 | 秒 | 在低延迟场景中,通常需要设置较短的连接超时时间,以减少等待时间,提高响应速度。 |
readTimeout | 读取数据的超时时间。 | 300 | 秒 | |
writeTimeout | 写入数据的超时时间。 | 60 | 秒 | |
connectionIdleTimeout | 连接池中空闲连接的超时时间。 | 300 | 秒 | 在高并发场景下,适当延长空闲连接超时时间,有利于避免频繁创建连接,从而降低资源消耗。 |
connectionPoolSize | 连接池中的最大连接数。 | 32 | 个 | 在高并发场景下:
建议根据业务需求调整配置。 |
maximumAsyncRequests | 最大并发请求数。全局的并发请求数限制(包含所有主机)。需要小于或等于最大连接数,否则可能出现请求阻塞的情况。 | 32 | 个 | |
maximumAsyncRequestsPerHost | 单台主机的最大并发请求数。需要小于或等于最大并发请求数。 | 32 | 个 |
请求示例
以下代码示例展示了如何配置连接池相关参数(如超时时间、最大连接数等),并调用大模型服务。您可以根据实际需求调整相关参数,以优化并发性能和资源利用率。
// 建议DashScope SDK的版本 >= 2.12.0
import java.time.Duration;
import java.util.Arrays;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.protocol.ConnectionConfigurations;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;
public class Main {
public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
Generation gen = new Generation();
Message systemMsg = Message.builder()
.role(Role.SYSTEM.getValue())
.content("You are a helpful assistant.")
.build();
Message userMsg = Message.builder()
.role(Role.USER.getValue())
.content("你是谁?")
.build();
GenerationParam param = GenerationParam.builder()
// 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
// 此处以qwen-plus为例,可按需更换模型名称。模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
.model("qwen-plus")
.messages(Arrays.asList(systemMsg, userMsg))
.resultFormat(GenerationParam.ResultFormat.MESSAGE)
.build();
System.out.println(userMsg.getContent());
return gen.call(param);
}
public static void main(String[] args) {
// 连接池配置
Constants.connectionConfigurations = ConnectionConfigurations.builder()
.connectTimeout(Duration.ofSeconds(10)) // 建立连接的超时时间, 默认 120s
.readTimeout(Duration.ofSeconds(300)) // 读取数据的超时时间, 默认 300s
.writeTimeout(Duration.ofSeconds(60)) // 写入数据的超时时间, 默认 60s
.connectionIdleTimeout(Duration.ofSeconds(300)) // 连接池中空闲连接的超时时间, 默认 300s
.connectionPoolSize(256) // 连接池中的最大连接数, 默认 32
.maximumAsyncRequests(256) // 最大并发请求数, 默认 32
.maximumAsyncRequestsPerHost(256) // 单个主机的最大并发请求数, 默认 32
.build();
try {
GenerationResult result = callWithMessage();
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
// 使用日志框架记录异常信息
System.err.println("An error occurred while calling the generation service: " + e.getMessage());
}
System.exit(0);
}
}
错误码
如果模型调用失败并返回报错信息,请参见错误信息进行解决。
- 本页导读 (1)
- 连接池
- 请求示例
- 安装模型调用SDK
- 错误码