本文为您介绍DashScope java SDK最佳实践。
查询SDK最新版本
https://oss.sonatype.org/#nexus-search;quick~dashscope
最佳实践
SDK API对象,例如Generation不是线程安全的,您不应该并发使用同一个对象。
因为每一个API对象都对应着一条网络链接,因此为了效率,您应尽可能复用已创建出来的API对象,例如Generation,避免不断创建造成的开销,通常可以通过资源池来管理,下面是一个简单的示例,供参考。
对象池示例(org.apache.commons:commons-pool2)
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import com.alibaba.dashscope.aigc.generation.Generation;
public class PooledDashScopeObjectFactory extends BasePooledObjectFactory<Generation> {
@Override
public Generation create() throws Exception {
return new Generation();
}
@Override
public PooledObject<Generation> wrap(Generation obj) {
return new DefaultPooledObject<>(obj);
}
}
对象池使用
import java.util.Arrays;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
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;
public class PooledDashScopeObjectUsage {
public static void main(String[] args) throws Exception {
PooledDashScopeObjectFactory pooledDashScopeObjectFactory =
new PooledDashScopeObjectFactory();
GenericObjectPoolConfig<Generation> config = new GenericObjectPoolConfig<>();
// 对于语音服务,websocket协议,保持下面值相同
config.setMaxTotal(32);
config.setMaxIdle(32);
config.setMinIdle(32);
GenericObjectPool<Generation> generationPool =
new GenericObjectPool<>(pooledDashScopeObjectFactory, config);
Generation gen = null;
try {
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().model("qwen-plus")
.messages(Arrays.asList(systemMsg, userMsg))
.resultFormat(GenerationParam.ResultFormat.MESSAGE).topP(0.8).enableSearch(true)
.build();
gen = generationPool.borrowObject();
GenerationResult result = gen.call(param);
System.out.println(result);
} finally {
if (gen != null) {
generationPool.returnObject(gen);
}
}
System.out.println("completed");
generationPool.close();
}
}
连接配置
底层使用OkHttp库管理连接,您可以通过代码和环境变量来配置连接相关参数,通常情况下您不需要修改任何参数,请根据需求谨慎修改。
以下内容适用于java sdk 2.12.0及之后版本!
通过代码配置连接参数
Constants.connectionConfigurations = ConnectionConfigurations.builder()
.connectTimeout(Duration.ofSeconds(120)) // set connection timeout, default 120s
.readTimeout(Duration.ofSeconds(300)) // set read timeout, default 300s
.writeTimeout(Duration.ofSeconds(60)) // set read timeout, default 60s
.connectionIdleTimeout(Duration.ofSeconds(300)) // connection pool idle timeout, default 300s
.connectionPoolSize(32) // idle connections in the okhttp connection pool.
.maximumAsyncRequests(32) // async requests limit.
.maximumAsyncRequestsPerHost(32) // async request host limit.
.proxyHost("The http proxy host") // set proxy host, if set will use proxy. default null.
.proxyPort(443) // set proxy port, default 443
.proxyAuthenticator(null) // you can customize you proxy authenticator. default null.
.build();
// 更多 connectionPoolSize and connectionIdleTimeout, 可以参考
// ref: https://square.github.io/okhttp/3.x/okhttp/okhttp3/ConnectionPool.html
// maximumAsyncRequests and maximumAsyncRequestsPerHost 只对streamCall, audio相关服务,以及您自行设置
// 的使用websocket连接对象,详细参考:https://square.github.io/okhttp/3.x/okhttp/okhttp3/Dispatcher.html
通过环境变量配置
详细信息参考代码说明。
环境变量 | 说明 |
DASHSCOPE_PROXY_HOST | 配置代理host |
DASHSCOPE_PROXY_PORT | 配置代理port |
DASHSCOPE_CONNECTION_POOL_SIZE | 配置connection pool中idle 连接数。 说明 根据您的负载情况配置,一般配置成流量低峰时并发数,最高并发数目前没有限制。 超过idle数的空闲连接将在DASHSCOPE_CONNECTION_IDLE_TIME后释放。 建议您配置一个较小的值,同时将DASHSCOPE_CONNECTION_IDLE_TIME配置一个相对小的值,比如5s。 |
DASHSCOPE_CONNECTION_IDLE_TIME | 配置idle time,与服务端的链接将在idle time后断开。 |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS | 配置最大异步请求数。 异步请求用于流式流式输出以及websocket请求,语音服务,流式请求,需要根据您的负载配置配置合适的值,参考 |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST | 配置单host最大异步请求数,host范围内异步请求数。 |
DASHSCOPE_WRITE_TIMEOUT | 配置write timeout |
DASHSCOPE_READ_TIMEOUT | 配置 read timeout |
DASHSCOPE_CONNECTION_TIMEOUT | 配置connection timeout |
更早版本配置
对于2.12.0之前版本,连接connectionPoolSize,maximumAsyncRequests,maximumAsyncRequestsPerHost统一通过环境变量DASHSCOPE_CONNECTION_POOL_SIZE配置。