java sdk最佳实践

本文为您介绍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配置。