Sem a reutilização de conexões, cada chamada de API abre uma nova conexão TCP e executa um handshake TLS, o que aumenta a latência. Em cenários de alta concorrência, essa sobrecarga causa timeouts e desperdício de recursos. A reutilização de conexões elimina a configuração repetida, reduzindo a latência e o consumo de recursos.
O DashScope SDK oferece suporte à reutilização de conexões em Java e Python:
- Java SDK: Um pool de conexões integrado vem ativado por padrão. Configure parâmetros como limite de conexões e tempos limite.
- Python SDK: Ative a reutilização de conexões passando uma Session personalizada. O SDK suporta chamadas síncronas e assíncronas.
Antes de começar
Antes de executar os exemplos de código:
Java SDK
O Java SDK inclui um pool de conexões integrado, ativado por padrão. Ajuste as configurações de limite de conexões e timeout para otimizar sua carga de trabalho.
Parâmetros
Parâmetro | Descrição | Valor padrão | Unidade |
|---|---|---|---|
connectTimeout | Tempo limite para estabelecimento da conexão. | 120 | segundos |
readTimeout | Tempo limite para leitura de dados. | 300 | segundos |
writeTimeout | Tempo limite para gravação de dados. | 60 | segundos |
connectionIdleTimeout | Tempo limite para conexões ociosas no pool. | 300 | segundos |
connectionPoolSize | Número máximo de conexões no pool. | 32 | conexões |
maximumAsyncRequests | Limite de requisições simultâneas em todos os hosts (limite global). | 32 | requisições |
maximumAsyncRequestsPerHost | Limite de requisições simultâneas por host. | 32 | requisições |
maximumAsyncRequestsdeve ser ≤connectionPoolSize; caso contrário, as requisições podem sofrer bloqueio.maximumAsyncRequestsPerHostdeve ser ≤maximumAsyncRequests.
- connectTimeout: Em cenários de baixa latência, defina um tempo limite menor para reduzir o tempo de espera.
- connectionIdleTimeout: Para cenários de alta concorrência, aumente o tempo limite de ociosidade para evitar a criação frequente de conexões e reduzir o consumo de recursos.
- connectionPoolSize: Poucas conexões em ambientes de alta concorrência causam bloqueios, timeouts e reconexões frequentes (maior uso de recursos). Por outro lado, conexões em excesso sobrecarregam o servidor. Equilibre a quantidade de conexões com base na sua carga de trabalho.
Exemplo de código
O exemplo abaixo configura os parâmetros do pool de conexões (timeout e limite de conexões) e chama um serviço de modelo. Ajuste os parâmetros para otimizar a concorrência e o uso de recursos.
// Recommended DashScope SDK version >= 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;
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("Who are you?")
.build();
GenerationParam param = GenerationParam.builder()
// API keys for Singapore and Beijing regions differ. Get an API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
// If you have not configured the environment variable, replace the following line with your Model Studio API key: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
// This example uses qwen-plus. Change the model name as needed. Model list: https://www.alibabacloud.com/help/en/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) {
// Connection pool configuration
Constants.connectionConfigurations = ConnectionConfigurations.builder()
.connectTimeout(Duration.ofSeconds(10)) // Timeout for establishing a connection, default 120s
.readTimeout(Duration.ofSeconds(300)) // Timeout for reading data, default 300s
.writeTimeout(Duration.ofSeconds(60)) // Timeout for writing data, default 60s
.connectionIdleTimeout(Duration.ofSeconds(300)) // Timeout for idle connections in the connection pool, default 300s
.connectionPoolSize(256) // Maximum connections in the connection pool, default 32
.maximumAsyncRequests(256) // Maximum concurrent requests, default 32
.maximumAsyncRequestsPerHost(256) // Maximum concurrent requests per host, default 32
.build();
try {
GenerationResult result = callWithMessage();
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
// Use a logging framework to record exception information
System.err.println("An error occurred while calling the generation service: " + e.getMessage());
}
System.exit(0);
}
}
// Recommended DashScope SDK version >= 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.protocol.Protocol;
import com.alibaba.dashscope.utils.Constants;
public class Main {
public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
// This is the Singapore region URL. Replace WorkspaceId with your actual workspace ID. URLs differ by region.
Generation gen = new Generation(Protocol.HTTP.getValue(), "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1");
Message systemMsg = Message.builder()
.role(Role.SYSTEM.getValue())
.content("You are a helpful assistant.")
.build();
Message userMsg = Message.builder()
.role(Role.USER.getValue())
.content("Who are you?")
.build();
GenerationParam param = GenerationParam.builder()
// API keys for Singapore and Beijing regions differ. Get an API key: https://www.alibabacloud.com/help/en/model-studio/get-api-key
// If you have not configured the environment variable, replace the following line with your Model Studio API key: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
// This example uses qwen-plus. Change the model name as needed. Model list: https://www.alibabacloud.com/help/en/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) {
// Connection pool configuration
Constants.connectionConfigurations = ConnectionConfigurations.builder()
.connectTimeout(Duration.ofSeconds(10)) // Timeout for establishing a connection, default 120s
.readTimeout(Duration.ofSeconds(300)) // Timeout for reading data, default 300s
.writeTimeout(Duration.ofSeconds(60)) // Timeout for writing data, default 60s
.connectionIdleTimeout(Duration.ofSeconds(300)) // Timeout for idle connections in the connection pool, default 300s
.connectionPoolSize(256) // Maximum connections in the connection pool, default 32
.maximumAsyncRequests(256) // Maximum concurrent requests, default 32
.maximumAsyncRequestsPerHost(256) // Maximum concurrent requests per host, default 32
.build();
try {
GenerationResult result = callWithMessage();
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
// Use a logging framework to record exception information
System.err.println("An error occurred while calling the generation service: " + e.getMessage());
}
System.exit(0);
}
}
Python SDK
O Python SDK permite a reutilização de conexões ao passar uma Session personalizada. Dois métodos de chamada têm suporte: HTTP assíncrono (baseado em corrotinas) e HTTP síncrono.
HTTP Assíncrono
Para cenários assíncronos, use aiohttp.ClientSession com aiohttp.TCPConnector para ativar a reutilização de conexões. O TCPConnector permite configurar parâmetros como limites de conexão:
Parâmetro | Descrição | Valor padrão | Observações |
|---|---|---|---|
limit | Limite total de conexões (todos os hosts). | 100 | Em cenários de alta concorrência, aumente este valor para melhorar a capacidade de processamento simultâneo. |
limit_per_host | Limite de conexões por host. | 0 (ilimitado) | Evita sobrecarga excessiva em um único host. |
ssl | Configuração do contexto SSL. | None | Validação de certificado SSL para HTTPS. |
Exemplo de código
O exemplo a seguir configura a reutilização de conexões e chama um serviço de modelo de forma assíncrona:
import asyncio
import httpx
import os
import dashscope
async def main():
# Configure os parâmetros de conexão
limits = httpx.Limits(
max_connections=100, # Limite total de conexões
max_keepalive_connections=30, # Número máximo de conexões keep-alive
)
# Crie um cliente HTTP personalizado e passe-o para o construtor do Client
async with httpx.AsyncClient(limits=limits) as http_client:
# Esta é a configuração da região China (Pequim). A configuração varia conforme a região.
# As API Keys das regiões Singapura e Pequim são diferentes. Obtenha uma API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Se a variável de ambiente não estiver configurada, defina sua API Key diretamente: api_key = "sk-xxx"
aclient = dashscope.AsyncClient(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/api/v1",
http_client=http_client, # Passe o cliente HTTP personalizado
)
response = await aclient.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Hello, please introduce yourself'}],
)
print(response)
asyncio.run(main())
import asyncio
import httpx
import os
import dashscope
async def main():
# Configure os parâmetros de conexão
limits = httpx.Limits(
max_connections=100, # Limite total de conexões
max_keepalive_connections=30, # Número máximo de conexões keep-alive
)
# Crie um cliente HTTP personalizado e passe-o para o construtor do Client
async with httpx.AsyncClient(limits=limits) as http_client:
# A configuração abaixo refere-se à região Singapura. Substitua {WorkspaceId} pelo ID real do seu workspace. O valor de region varia conforme a região.
# A API Key da região Singapura é diferente da da região Pequim. Obtenha uma API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Se a variável de ambiente não estiver configurada, defina sua API Key diretamente: api_key = "sk-xxx"
aclient = dashscope.AsyncClient(
api_key=os.getenv("DASHSCOPE_API_KEY"),
workspace="{WorkspaceId}",
region="ap-southeast-1",
http_client=http_client, # Passe o cliente HTTP personalizado
)
response = await aclient.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Hello, please introduce yourself'}],
)
print(response)
asyncio.run(main())
HTTP Síncrono
Em cenários síncronos, use requests.Session para ativar a reutilização de conexões. Múltiplas requisições dentro da mesma Session reaproveitam a conexão TCP subjacente, evitando a sobrecarga de estabelecer conexões repetidamente.
Exemplo de código: chamada única
Este exemplo demonstra a configuração de reutilização de conexões para chamar um serviço de modelo sincronamente:
import httpx
import os
import dashscope
# Use a instrução with para garantir que o cliente HTTP seja fechado corretamente
with httpx.Client() as http_client:
# Esta é a configuração da região China (Pequim). A configuração varia conforme a região.
# As API Keys das regiões Singapura e Pequim são diferentes. Obtenha uma API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Se a variável de ambiente não estiver configurada, defina sua API Key diretamente: api_key = "sk-xxx"
client = dashscope.Client(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/api/v1",
http_client=http_client, # Passe o cliente HTTP personalizado
)
response = client.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Hello'}],
)
print(response)
import httpx
import os
import dashscope
# Use a instrução with para garantir que o cliente HTTP seja fechado corretamente
with httpx.Client() as http_client:
# A configuração abaixo refere-se à região Singapura. Substitua {WorkspaceId} pelo ID real do seu workspace. O valor de region varia conforme a região.
# A API Key da região Singapura é diferente da da região Pequim. Obtenha uma API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Se a variável de ambiente não estiver configurada, defina sua API Key diretamente: api_key = "sk-xxx"
client = dashscope.Client(
api_key=os.getenv("DASHSCOPE_API_KEY"),
workspace="{WorkspaceId}",
region="ap-southeast-1",
http_client=http_client, # Passe o cliente HTTP personalizado
)
response = client.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Hello'}],
)
print(response)
Exemplo de código: múltiplas chamadas com uma Session compartilhada
Para reutilizar uma Session em várias chamadas:
import httpx
import os
import dashscope
# Crie um objeto de cliente HTTP e configure os parâmetros de reutilização de conexão
http_client = httpx.Client(
limits=httpx.Limits(
max_connections=100, # Limite total de conexões
max_keepalive_connections=30, # Número máximo de conexões keep-alive
),
)
# Esta é a configuração da região China (Pequim). A configuração varia conforme a região.
# As API Keys das regiões Singapura e Pequim são diferentes. Obtenha uma API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Se a variável de ambiente não estiver configurada, defina sua API Key diretamente: api_key = "sk-xxx"
client = dashscope.Client(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/api/v1",
http_client=http_client, # Passe o cliente HTTP personalizado
)
try:
# Reutilize o mesmo cliente HTTP em múltiplas chamadas
response1 = client.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Hello'}],
)
print(response1)
response2 = client.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Introduce yourself'}],
)
print(response2)
finally:
# Garanta que o cliente HTTP seja fechado corretamente
http_client.close()
import httpx
import os
import dashscope
# Crie um objeto de cliente HTTP e configure os parâmetros de reutilização de conexão
http_client = httpx.Client(
limits=httpx.Limits(
max_connections=100, # Limite total de conexões
max_keepalive_connections=30, # Número máximo de conexões keep-alive
),
)
# A configuração abaixo refere-se à região Singapura. Substitua {WorkspaceId} pelo ID real do seu workspace. O valor de region varia conforme a região.
# A API Key da região Singapura é diferente da da região Pequim. Obtenha uma API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Se a variável de ambiente não estiver configurada, defina sua API Key diretamente: api_key = "sk-xxx"
client = dashscope.Client(
api_key=os.getenv("DASHSCOPE_API_KEY"),
workspace="{WorkspaceId}",
region="ap-southeast-1",
http_client=http_client, # Passe o cliente HTTP personalizado
)
try:
# Reutilize o mesmo cliente HTTP em múltiplas chamadas
response1 = client.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Hello'}],
)
print(response1)
response2 = client.chat.completions.create(
model='qwen-plus',
messages=[{"role": "user", "content": 'Introduce yourself'}],
)
print(response2)
finally:
# Garanta que o cliente HTTP seja fechado corretamente
http_client.close()
Melhores práticas
- Java SDK: Defina
connectionPoolSizeemaximumAsyncRequestsconforme sua carga de trabalho. Encontre o equilíbrio na quantidade de conexões: poucas causam bloqueios, enquanto muitas sobrecarregam o servidor. - Python SDK: Utilize a instrução
withpara gerenciar o ciclo de vida da Session e garantir a limpeza correta dos recursos. - Escolha o método adequado: Opte por chamadas assíncronas em aplicações assíncronas (asyncio, FastAPI). Prefira chamadas síncronas para aplicações tradicionais.
Códigos de erro
Se uma chamada de modelo falhar, consulte Mensagens de erro para resolver o problema.